blob: 86fbbd4b175ee727fe552cfc44a04ba1a60dfc69 [file] [log] [blame] [edit]
// Copyright (c) 2025, 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:analyzer/src/utilities/dot_shorthands.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../src/dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(HasDependentDotShorthandTest);
});
}
@reflectiveTest
class HasDependentDotShorthandTest extends PubPackageResolutionTest {
void assertHasDependentDotShorthand() async {
var initializer = findNode.singleVariableDeclaration.initializer;
expect(hasDependentDotShorthand(initializer!), isTrue);
}
void assertHasNoDependentDotShorthand() async {
var initializer = findNode.singleVariableDeclaration.initializer;
expect(hasDependentDotShorthand(initializer!), isFalse);
}
test_constructorInvocation() async {
await assertNoErrorsInCode(r'''
class A<X> {
A(X x);
A.named(X x);
}
A<A> a = A(.named(null));
''');
assertHasDependentDotShorthand();
}
test_constructorInvocation_explicitTypeArgument() async {
await assertNoErrorsInCode(r'''
class A<X> {
A(X x);
A.named(X x);
}
A<A> a = A<A>(.named(null));
''');
assertHasNoDependentDotShorthand();
}
test_constructorInvocation_nested() async {
await assertNoErrorsInCode(r'''
class A<X> {
A(X x);
A.named(X x);
}
X id<X>(X x) => x;
A<A> a = A(id(.named(null)));
''');
assertHasDependentDotShorthand();
}
test_constructorInvocation_noTypeParametersInParameter() async {
await assertNoErrorsInCode(r'''
class A<X> {
A(int x);
}
A<String> a = A(.parse('0'));
''');
assertHasNoDependentDotShorthand();
}
test_functionExpression() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
E Function() e = () => .a;
''');
assertHasDependentDotShorthand();
}
test_functionExpression_list() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
List<E> Function() e = () => [.a];
''');
assertHasDependentDotShorthand();
}
test_list() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
List<E> e = [.b];
''');
assertHasDependentDotShorthand();
}
test_map() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
Map<String, E> e = {'test': .b};
''');
assertHasDependentDotShorthand();
}
test_methodInvocation() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t) => t;
E e = f(.a);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_filterTypeArguments() async {
await assertNoErrorsInCode(r'''
class A {
A.named();
}
X id<X>(X x) => x;
bar<T extends A>(T t) {
Map<T, S> baz<S>(T t, S s) => {t: s};
Map<T, A> m = baz(id(id(id(id(id(id(t)))))), .named());
print(m);
}
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_functionType_parameter_blockBody() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S f<S>(S Function() s) => s();
T t<T>(T t) => t;
E e = f(() { return t(.a); });
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_functionType_parameter_blockBody_independent() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S f<S>(S Function() s) => s();
E eFn(E e) => e;
E e = f(() { return eFn(.a); });
''');
assertHasNoDependentDotShorthand();
}
test_methodInvocation_functionType_parameter_expressionBody() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S f<S>(S Function() s) => s();
E e = f(() => .a);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_functionType_parameter_expressionBody2() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S f<S>(S Function(S) s, S input) => s(input);
E e = f((E _) => .a, E.b);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_functionType_returnType() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S Function(T) f<T, S>(T t, S s) => (T t) => s;
E Function(E) e = f(E.a, .b);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_functionType_returnType2() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S Function(T) f<T, S>(T t, S s) => (T t) => s;
E Function(E) e = f(.a, E.b);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_list() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
S f<S>(List<S> s) => s[0];
E e = f([.a, .b]);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_multipleTypeParameter() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
E d(E e) => e;
S f<T, S>(T t, S s) => s;
T g<T>(T t) => t;
E e = f(d(.a), g(.b));
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_multipleTypeParameters() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
E d(E e) => e;
S f<T, S>(T t, S s) => s;
T g<T>(T t) => t;
E e = f(d(.a), E.b);
''');
assertHasNoDependentDotShorthand();
}
test_methodInvocation_noTypeParameters() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c; }
T id<T>(T t) => t;
E idE(E e) => e;
E e = idE(id(.b));
''');
assertHasNoDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t, E e) => t;
E e = f(.a, .b);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_explicitTypeArguments() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t, E e) => t;
E e = f<E>(.a, .b);
''');
assertHasNoDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_functionType() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T? Function() d<T>(T t) => () { return t;};
E? Function() e = d(.a);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_functionType_nested() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T? Function() d<T>(T t) => () { return t;};
T f<T>(T t, E e) => t;
E? Function() e = d(f(.a, .b));
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_independent() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t, E e) => t;
E e = f(E.a, .b);
''');
assertHasNoDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_nested() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t, E e) => t;
E e = f(f(.a, .b), .c);
''');
assertHasDependentDotShorthand();
}
test_methodInvocation_singleTypeParameter_nested_independent() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
T f<T>(T t, E e) => t;
E e = f(E.a, f(.b, .c));
''');
assertHasNoDependentDotShorthand();
}
test_set() async {
await assertNoErrorsInCode(r'''
enum E { a, b, c }
Set<E> e = {.b};
''');
assertHasDependentDotShorthand();
}
}