dart-sdk/tests/language/const_string_test.dart
Matthias Hausner 11a101a325 Canonicalize expressions that may be used as constants
Evaluate and canonicalize the parameters to the built-in function
identical(a,b) if they are strings. This guarantees that
identical(“ab”, “a”+”b”) evaluates to true.

Note: when the parser parses “a”+”b”, it doesn’t know whether the
expression will be used in a context that may require a
constant value. The canonicalization is thus deferred until it is
known that it is required.

BUG=25024
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1558033002 .
2016-01-05 08:51:52 -08:00

52 lines
1.8 KiB
Dart

// Copyright (c) 2011, 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.
import "package:expect/expect.dart";
// Exercises compile-time string constants
const yz = "y" + "z";
main() {
// Constant comparisons are independent of the quotes used.
Expect.isTrue(identical("abcd", 'abcd'));
Expect.isTrue(identical('abcd', "abcd"));
Expect.isTrue(identical("ab\"cd", 'ab"cd'));
Expect.isTrue(identical('ab\'cd', "ab'cd"));
// String concatenation works even when quotes are different.
Expect.isTrue(identical("abcd", "ab" "cd"));
Expect.isTrue(identical("abcd", "ab" 'cd'));
Expect.isTrue(identical("abcd", 'ab' 'cd'));
Expect.isTrue(identical("abcd", 'ab' "cd"));
// Or when there are more than 2 contatenations.
Expect.isTrue(identical("abcd", "a" "b" "cd"));
Expect.isTrue(identical("abcd", "a" "b" "c" "d"));
Expect.isTrue(identical('abcd', 'a' 'b' 'c' 'd'));
Expect.isTrue(identical("abcd", "a" "b" 'c' "d"));
Expect.isTrue(identical("abcd", 'a' 'b' 'c' 'd'));
Expect.isTrue(identical("abcd", 'a' "b" 'c' "d"));
Expect.isTrue(identical("a'b'cd", "a" "'b'" 'c' "d"));
Expect.isTrue(identical("a\"b\"cd", "a" '"b"' 'c' "d"));
Expect.isTrue(identical("a\"b\"cd", "a" '"b"' 'c' "d"));
Expect.isTrue(identical("a'b'cd", 'a' "'b'" 'c' "d"));
Expect.isTrue(identical('a\'b\'cd', "a" "'b'" 'c' "d"));
Expect.isTrue(identical('a"b"cd', 'a' '"b"' 'c' "d"));
Expect.isTrue(identical("a\"b\"cd", 'a' '"b"' 'c' "d"));
const a = identical("ab", "a" + "b");
Expect.isTrue(a);
const b = identical("xyz", "x" + yz);
Expect.isTrue(b);
const c = identical("12", "1" "2");
Expect.isTrue(c);
const d = identical("zyz", "z$yz");
Expect.isTrue(d);
}