blob: 088f11acd73c65139cd7824e89946892cee67b9e [file] [log] [blame]
// 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.
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(InvalidUseOfVisibleForTemplateMemberTest);
});
}
@reflectiveTest
class InvalidUseOfVisibleForTemplateMemberTest
extends PubPackageResolutionTest {
@override
void setUp() {
super.setUp();
writeTestPackageConfig(PackageConfigFileBuilder(),
angularMeta: true, meta: true);
}
test_class_constructor_named() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
class A {
int _x;
@visibleForTemplate
A.forTemplate(this._x);
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
new A.forTemplate(0);
}
''');
await assertErrorsInFile2(lib1, [
error(WarningCode.UNUSED_FIELD, 66, 2),
]);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 38, 13),
]);
}
test_class_constructor_unnamed() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
class A {
int _x;
@visibleForTemplate
A(this._x);
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
new A(0);
}
''');
await assertErrorsInFile2(lib1, [
error(WarningCode.UNUSED_FIELD, 66, 2),
]);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 38, 1),
]);
}
test_class_declaration() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
A;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_class_getter() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
class A {
@visibleForTemplate
int get foo => 7;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 39, 3),
]);
}
test_class_getter_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
@visibleOutsideTemplate
A();
@visibleOutsideTemplate
int get foo => 7;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_class_method() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 39, 3),
]);
}
test_class_method_fromTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
class A {
@visibleForTemplate
void foo() {}
}
''');
var template = newFile('$testPackageLibPath/lib1.template.dart', r'''
import 'lib1.dart';
class B {
void b(A a) => a.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(template, []);
}
test_class_method_inMixin() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
mixin M {
int foo() => 1;
}
class C with M {}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(C c) {
c.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 39, 3),
]);
}
test_class_method_inMixin_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
mixin M {
@visibleOutsideTemplate
int foo() => 1;
}
class C with M {}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(C c) {
c.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_class_method_parameter_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
late bool bar;
@visibleOutsideTemplate
void foo({required bool bar}){
this.bar = bar;
}
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo(bar: true);
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_class_method_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
@visibleOutsideTemplate
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_class_setter() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
set bar(_) => 7;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.bar = 6;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 39, 3),
]);
}
test_class_setter_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
@visibleOutsideTemplate
set bar(_) => 7;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f(A a) {
a.bar = 6;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_enum_constant() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
enum E {
a,
b,
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
E.a;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 36, 1),
]);
}
test_enum_constant_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
enum E {
@visibleOutsideTemplate
a,
b,
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
E.a;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_enum_declaration() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
enum E {
a,
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
E;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_export() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
int foo() => 1;
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
export 'lib1.dart' show foo;
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_extend_class() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
class B extends A {
}
void f() {
var b = B();
b.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 73, 3),
]);
}
test_extend_class_super() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
class B extends A {
void bar() => super.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 63, 3),
]);
}
test_extend_class_withOverride() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
class B extends A {
@override
int foo() => 2;
}
void f() {
var b = B();
b.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_extend_class_withProtected() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
import 'package:meta/meta.dart';
@visibleForTemplate
class A {
@protected
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
class B extends A {
int foo() => super.foo();
}
void f() {
var b = B();
b.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_function_inExtension() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
extension E on List {
@visibleForTemplate
int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
E([]).foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 40, 3),
]);
}
test_function_inExtension_fromTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
extension E on List {
@visibleForTemplate
int foo() => 1;
}
''');
var template = newFile('$testPackageLibPath/lib1.template.dart', r'''
import 'lib1.dart';
void f() {
E([]).foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(template, []);
}
test_protectedAndForTemplate_usedAsProtected() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
import 'package:meta/meta.dart';
class A {
@protected
@visibleForTemplate
void a(){ }
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
class B extends A {
void b() => new A().a();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_protectedAndForTemplate_usedAsTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
import 'package:meta/meta.dart';
class A {
@protected
@visibleForTemplate
void foo() {}
}
''');
var template = newFile('$testPackageLibPath/lib1.template.dart', r'''
import 'lib1.dart';
void f(A a) {
a.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(template, []);
}
test_static_class_member_withVisibleOutsideTemplate() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class C {
@visibleOutsideTemplate
static int foo() => 1;
}
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
C.foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_supertype_method() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
class A {}
var a = A();
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
print(a.hashCode);
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, []);
}
test_topLevelFunction() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
int foo() => 1;
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
foo();
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 34, 3),
]);
}
test_topLevelVariable() async {
var lib1 = newFile('$testPackageLibPath/lib1.dart', r'''
import 'package:angular_meta/angular_meta.dart';
@visibleForTemplate
int foo = 7;
''');
var lib2 = newFile('$testPackageLibPath/lib2.dart', r'''
import 'lib1.dart';
void f() {
foo;
}
''');
await assertErrorsInFile2(lib1, []);
await assertErrorsInFile2(lib2, [
error(WarningCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 34, 3),
]);
}
}