Files
sdk/tests/language/variable/ref_before_declaration_test.dart
T
Johnni Winther b8b072ed3b [cfe] Update message for undefined access
This updates the message text for undefined access. Instead of saying
that the member is not defined on the "class", it now says on the "type".

Closes #60290

Change-Id: I9387f892e99ba109b9b1d99af25714ab83b5350c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/433941
Reviewed-by: Erik Ernst <eernst@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
2025-06-17 04:03:26 -07:00

129 lines
3.4 KiB
Dart

// Copyright (c) 2013, 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.
// Test compile-time errors for illegal variable declarations if the name
// has been referenced before the variable is declared.
import 'dart:math' as math;
use(value) => value;
var x = 0;
final y = 0;
class C {
var f;
C() : f = 'How do you spell PTSD?';
void test1() {
use(f); // Refers to instance field f.
// ^
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'f' can't be referenced before it is declared.
var f = 'A shut mouth gathers no foot.';
}
void test2() {
void localFunc() {
use(f); // Refers to instance field f.
// ^
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'f' can't be referenced before it is declared.
}
var f = 'When chemists die, they barium.';
if (true) {
var f = 1; // ok, shadows outer f and instance field f.
}
}
void test3() {
if (true) {
use(x); // Refers to top-level x.
// ^
// [analyzer] COMPILE_TIME_ERROR.READ_POTENTIALLY_UNASSIGNED_FINAL
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'x' can't be referenced before it is declared.
use(y); // Refers to top-level y.
// ^
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'y' can't be referenced before it is declared.
}
final x = "I have not yet begun to procrastinate.";
const y = "Honk if you like peace and quiet!";
}
void test4() {
void Q() {
P(); // Refers to non-existing top-level function P
// [error column 7, length 1]
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'P' can't be referenced before it is declared.
// [cfe] The method 'P' isn't defined for the type 'C'.
}
void P() {
Q();
}
Function f = () {
x = f;
// ^
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'f' can't be referenced before it is declared.
};
}
test() {
test1();
test2();
test3();
test4();
}
}
void testTypeRef() {
String s = 'Can vegetarians eat animal crackers?';
// [error column 3, length 6]
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'String' can't be referenced before it is declared.
var String = "I distinctly remember forgetting that.";
}
void testLibPrefix() {
var pie = math.pi;
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.READ_POTENTIALLY_UNASSIGNED_FINAL
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// [cfe] Local variable 'math' can't be referenced before it is declared.
final math = 0;
}
void noErrorsExpected() {
use(x);
for (var x = 0; x < 10; x++) use(x);
for (var i = 0; i < 10; i++) var x = 0;
if (true) var x = 0;
while (false) var x = 0;
try {
throw "ball";
} catch (x) {
use(x);
}
switch (x) {
case 0:
var x = 'Does fuzzy logic tickle?';
}
var int = 007;
}
void main() {
var c = new C();
c.test();
testTypeRef();
testLibPrefix();
noErrorsExpected();
}