blob: 5ad5a42435220c1accbface901e15522f70b07f5 [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/dart/element/nullability_suffix.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:source_span/source_span.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../generated/test_support.dart';
import '../src/dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ErrorReporterTest);
});
}
@reflectiveTest
class ErrorReporterTest extends PubPackageResolutionTest {
var listener = GatheringDiagnosticListener();
test_atElement_named() async {
await resolveTestCode('class A {}');
var element = findElement2.class_('A');
var firstFragment = element.firstFragment;
var reporter = DiagnosticReporter(
listener,
firstFragment.libraryFragment.source,
);
reporter.atElement2(
element,
CompileTimeErrorCode.castToNonType,
arguments: ['A'],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.offset, firstFragment.nameOffset);
}
test_atElement_unnamed() async {
await resolveTestCode(r'''
extension on int {}
''');
var element = findElement2.unnamedExtension();
var firstFragment = element.firstFragment;
var reporter = DiagnosticReporter(
listener,
firstFragment.libraryFragment.source,
);
reporter.atElement2(
element,
CompileTimeErrorCode.castToNonType,
arguments: ['A'],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.offset, -1);
}
test_atNode_types_differentNames() async {
newFile('$testPackageLibPath/a.dart', 'class A {}');
newFile('$testPackageLibPath/b.dart', 'class B {}');
await resolveTestCode(r'''
import 'package:test/a.dart';
import 'package:test/b.dart';
main() {
x;
}
''');
var aImport = findElement2.importFind('package:test/a.dart');
var bImport = findElement2.importFind('package:test/b.dart');
var firstType = aImport
.class_('A')
.instantiate(
typeArguments: [],
nullabilitySuffix: NullabilitySuffix.none,
);
var secondType = bImport
.class_('B')
.instantiate(
typeArguments: [],
nullabilitySuffix: NullabilitySuffix.none,
);
var reporter = DiagnosticReporter(
listener,
firstType.element.firstFragment.libraryFragment.source,
);
reporter.atNode(
findNode.simple('x'),
CompileTimeErrorCode.argumentTypeNotAssignable,
arguments: [firstType, secondType, ''],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.message, isNot(contains('(')));
}
test_atNode_types_sameName() async {
newFile('$testPackageLibPath/a.dart', 'class A {}');
newFile('$testPackageLibPath/b.dart', 'class A {}');
await resolveTestCode(r'''
import 'package:test/a.dart';
import 'package:test/b.dart';
main() {
x;
}
''');
var aImport = findElement2.importFind('package:test/a.dart');
var bImport = findElement2.importFind('package:test/b.dart');
var firstType = aImport
.class_('A')
.instantiate(
typeArguments: [],
nullabilitySuffix: NullabilitySuffix.none,
);
var secondType = bImport
.class_('A')
.instantiate(
typeArguments: [],
nullabilitySuffix: NullabilitySuffix.none,
);
var reporter = DiagnosticReporter(
listener,
firstType.element.firstFragment.libraryFragment.source,
);
reporter.atNode(
findNode.simple('x'),
CompileTimeErrorCode.argumentTypeNotAssignable,
arguments: [firstType, secondType, ''],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.message, contains('('));
}
test_atNode_types_sameName_functionType() async {
newFile('$testPackageLibPath/a.dart', 'class A{}');
newFile('$testPackageLibPath/b.dart', 'class A{}');
await resolveTestCode(r'''
import 'a.dart' as a;
import 'b.dart' as b;
a.A Function() fa;
b.A Function() fb;
main() {
x;
}
''');
var fa = findNode.topLevelVariableDeclaration('fa');
var fb = findNode.topLevelVariableDeclaration('fb');
var source = result.unit.declaredFragment!.source;
var reporter = DiagnosticReporter(listener, source);
reporter.atNode(
findNode.simple('x'),
CompileTimeErrorCode.argumentTypeNotAssignable,
arguments: [fa.variables.type!.type!, fb.variables.type!.type!, ''],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.message, contains('a.dart'));
expect(diagnostic.message, contains('b.dart'));
}
test_atNode_types_sameName_nested() async {
newFile('$testPackageLibPath/a.dart', 'class A{}');
newFile('$testPackageLibPath/b.dart', 'class A{}');
await resolveTestCode(r'''
import 'a.dart' as a;
import 'b.dart' as b;
B<a.A> ba;
B<b.A> bb;
class B<T> {}
main() {
x;
}
''');
var ba = findNode.topLevelVariableDeclaration('ba');
var bb = findNode.topLevelVariableDeclaration('bb');
var source = result.unit.declaredFragment!.source;
var reporter = DiagnosticReporter(listener, source);
reporter.atNode(
findNode.simple('x'),
CompileTimeErrorCode.argumentTypeNotAssignable,
arguments: [ba.variables.type!.type!, bb.variables.type!.type!, ''],
);
var diagnostic = listener.diagnostics[0];
expect(diagnostic.message, contains('a.dart'));
expect(diagnostic.message, contains('b.dart'));
}
test_atSourceSpan() async {
var source = TestSource();
var reporter = DiagnosticReporter(listener, source);
var text = '''
foo: bar
zap: baz
''';
var offset = text.indexOf('baz');
var length = 'baz'.length;
var span = SourceSpanBase(
SourceLocation(offset),
SourceLocation(offset + length),
'baz',
);
reporter.atSourceSpan(
span,
AnalysisOptionsWarningCode.unsupportedOptionWithLegalValue,
arguments: ['test', 'zip', 'zap'],
);
expect(listener.diagnostics, hasLength(1));
expect(listener.diagnostics.first.offset, offset);
expect(listener.diagnostics.first.length, length);
}
test_creation() async {
var source = TestSource();
var reporter = DiagnosticReporter(listener, source);
expect(reporter, isNotNull);
}
}