diff --git a/pkg/analysis_server/test/services/linter/linter_test.dart b/pkg/analysis_server/test/services/linter/linter_test.dart index 14b005459d33..cbedfc96d049 100644 --- a/pkg/analysis_server/test/services/linter/linter_test.dart +++ b/pkg/analysis_server/test/services/linter/linter_test.dart @@ -31,7 +31,11 @@ class LinterRuleOptionsValidatorTest { setUp() { registerLintRules(); recorder = new RecordingErrorListener(); - reporter = new ErrorReporter(recorder, new _TestSource()); + reporter = new ErrorReporter( + recorder, + new _TestSource(), + isNonNullableByDefault: false, + ); } test_linter_defined_rules() { diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart index dae835f8299f..6b704795e291 100644 --- a/pkg/analyzer/lib/error/listener.dart +++ b/pkg/analyzer/lib/error/listener.dart @@ -67,6 +67,11 @@ class ErrorReporter { */ final Source _defaultSource; + /** + * Is `true` if the library being analyzed is non-nullable by default. + */ + final bool isNonNullableByDefault; + /** * The source to be used when reporting errors. */ @@ -77,7 +82,8 @@ class ErrorReporter { * given [_errorListener]. Errors will be reported against the * [_defaultSource] unless another source is provided later. */ - ErrorReporter(this._errorListener, this._defaultSource) { + ErrorReporter(this._errorListener, this._defaultSource, + {this.isNonNullableByDefault = false}) { if (_errorListener == null) { throw ArgumentError("An error listener must be provided"); } else if (_defaultSource == null) { @@ -204,13 +210,13 @@ class ErrorReporter { buffer.write(name); (type as TypeImpl).appendTo( buffer, - withNullability: false, + withNullability: isNonNullableByDefault, skipAllDynamicArguments: false, ); return buffer.toString(); } } - return type.getDisplayString(withNullability: false); + return type.getDisplayString(withNullability: isNonNullableByDefault); } Map> typeGroups = {}; diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart index da13e3512389..6838dddbedab 100644 --- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart +++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart @@ -138,6 +138,9 @@ class LibraryAnalyzer { } timerLibraryAnalyzerFreshUnit.stop(); + _libraryElement = _elementFactory.libraryOfUri(_library.uriStr); + _libraryScope = LibraryScope(_libraryElement); + // Resolve URIs in directives to corresponding sources. FeatureSet featureSet = units[_library].featureSet; units.forEach((file, unit) { @@ -145,9 +148,6 @@ class LibraryAnalyzer { _resolveUriBasedDirectives(file, unit); }); - _libraryElement = _elementFactory.libraryOfUri(_library.uriStr); - _libraryScope = LibraryScope(_libraryElement); - timerLibraryAnalyzerResolve.start(); _resolveDirectives(units); @@ -465,7 +465,11 @@ class LibraryAnalyzer { ErrorReporter _getErrorReporter(FileState file) { return _errorReporters.putIfAbsent(file, () { RecordingErrorListener listener = _getErrorListener(file); - return ErrorReporter(listener, file.source); + return ErrorReporter( + listener, + file.source, + isNonNullableByDefault: _libraryElement.isNonNullableByDefault, + ); }); } diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart index f99ba55ced2e..c6ef38ea9686 100644 --- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart +++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart @@ -458,8 +458,11 @@ class ConstantVerifier extends RecursiveAstVisitor { /// @return the value of the compile time constant DartObjectImpl _validate(Expression expression, ErrorCode errorCode) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter subErrorReporter = - ErrorReporter(errorListener, _errorReporter.source); + ErrorReporter subErrorReporter = ErrorReporter( + errorListener, + _errorReporter.source, + isNonNullableByDefault: _currentLibrary.isNonNullableByDefault, + ); DartObjectImpl result = expression.accept(ConstantVisitor(_evaluationEngine, subErrorReporter)); _reportErrors(errorListener.errors, errorCode); @@ -550,8 +553,11 @@ class ConstantVerifier extends RecursiveAstVisitor { // can't be evaluated we'll just report a single error. AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER; - ErrorReporter subErrorReporter = - ErrorReporter(errorListener, _errorReporter.source); + ErrorReporter subErrorReporter = ErrorReporter( + errorListener, + _errorReporter.source, + isNonNullableByDefault: _currentLibrary.isNonNullableByDefault, + ); DartObjectImpl result = initializer .accept(ConstantVisitor(_evaluationEngine, subErrorReporter)); if (result == null) { diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index 937979f86dca..171fcb591539 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart @@ -98,6 +98,10 @@ class ConstantEvaluationEngine { ), experimentStatus = experimentStatus ?? ExperimentStatus(); + bool get _isNonNullableByDefault { + return (typeSystem as TypeSystemImpl).isNonNullableByDefault; + } + /// Check that the arguments to a call to fromEnvironment() are correct. The /// [arguments] are the AST nodes of the arguments. The [argumentValues] are /// the values of the unnamed arguments. The [namedArgumentValues] are the @@ -169,8 +173,11 @@ class ConstantEvaluationEngine { Expression defaultValue = constant.constantInitializer; if (defaultValue != null) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter errorReporter = - ErrorReporter(errorListener, constant.source); + ErrorReporter errorReporter = ErrorReporter( + errorListener, + constant.source, + isNonNullableByDefault: _isNonNullableByDefault, + ); DartObjectImpl dartObject = defaultValue.accept(ConstantVisitor(this, errorReporter)); constant.evaluationResult = @@ -184,8 +191,11 @@ class ConstantEvaluationEngine { Expression constantInitializer = constant.constantInitializer; if (constantInitializer != null) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter errorReporter = - ErrorReporter(errorListener, constant.source); + ErrorReporter errorReporter = ErrorReporter( + errorListener, + constant.source, + isNonNullableByDefault: _isNonNullableByDefault, + ); DartObjectImpl dartObject = constantInitializer.accept(ConstantVisitor(this, errorReporter)); // Only check the type for truly const declarations (don't check final @@ -235,8 +245,11 @@ class ConstantEvaluationEngine { element.isConst && constNode.arguments != null) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter errorReporter = - ErrorReporter(errorListener, constant.source); + ErrorReporter errorReporter = ErrorReporter( + errorListener, + constant.source, + isNonNullableByDefault: _isNonNullableByDefault, + ); ConstantVisitor constantVisitor = ConstantVisitor(this, errorReporter); DartObjectImpl result = evaluateConstructorCall( constNode, @@ -551,8 +564,11 @@ class ConstantEvaluationEngine { // different source. But they still should cause a constant evaluation // error for the current node. var externalErrorListener = BooleanErrorListener(); - var externalErrorReporter = - ErrorReporter(externalErrorListener, constructor.source); + var externalErrorReporter = ErrorReporter( + externalErrorListener, + constructor.source, + isNonNullableByDefault: _isNonNullableByDefault, + ); // Start with final fields that are initialized at their declaration site. List fields = constructor.enclosingElement.fields; @@ -811,8 +827,11 @@ class ConstantEvaluationEngine { ConstantEvaluationTarget constant) { if (constant is VariableElement) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter errorReporter = - ErrorReporter(errorListener, constant.source); + ErrorReporter errorReporter = ErrorReporter( + errorListener, + constant.source, + isNonNullableByDefault: _isNonNullableByDefault, + ); // TODO(paulberry): It would be really nice if we could extract enough // information from the 'cycle' argument to provide the user with a // description of the cycle. diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart index 18738ae5686f..adfc270327b6 100644 --- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart +++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart @@ -97,7 +97,11 @@ class ResolutionVisitor extends RecursiveAstVisitor { var typeProvider = libraryElement.typeProvider; var unitSource = unitElement.source; var isNonNullableByDefault = featureSet.isEnabled(Feature.non_nullable); - var errorReporter = ErrorReporter(errorListener, unitSource); + var errorReporter = ErrorReporter( + errorListener, + unitSource, + isNonNullableByDefault: isNonNullableByDefault, + ); var typeNameResolver = TypeNameResolver( libraryElement.typeSystem, diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart index d768b47adbed..832d6896c8b4 100644 --- a/pkg/analyzer/lib/src/generated/constant.dart +++ b/pkg/analyzer/lib/src/generated/constant.dart @@ -129,7 +129,11 @@ class ConstantEvaluator { EvaluationResult evaluate(Expression expression) { RecordingErrorListener errorListener = RecordingErrorListener(); - ErrorReporter errorReporter = ErrorReporter(errorListener, _source); + ErrorReporter errorReporter = ErrorReporter( + errorListener, + _source, + isNonNullableByDefault: _typeSystem.isNonNullableByDefault, + ); DartObjectImpl result = expression.accept(ConstantVisitor( ConstantEvaluationEngine(_typeProvider, DeclaredVariables(), typeSystem: _typeSystem), diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart index e5986a08e314..523c562ef394 100644 --- a/pkg/analyzer/lib/src/generated/parser_fasta.dart +++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart @@ -380,7 +380,11 @@ class _Parser2 extends ParserAdapter { factory _Parser2( Source source, AnalysisErrorListener errorListener, FeatureSet featureSet, {bool allowNativeClause = false}) { - var errorReporter = ErrorReporter(errorListener, source); + var errorReporter = ErrorReporter( + errorListener, + source, + isNonNullableByDefault: featureSet.isEnabled(Feature.non_nullable), + ); return _Parser2._(source, errorReporter, source.uri, featureSet, allowNativeClause: allowNativeClause); } diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 71e83f81fad9..9b4e42ab0694 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -2729,7 +2729,11 @@ abstract class ScopedVisitor extends UnifyingAstVisitor { AnalysisErrorListener errorListener, {Scope nameScope}) : source = source, - errorReporter = ErrorReporter(errorListener, source) { + errorReporter = ErrorReporter( + errorListener, + source, + isNonNullableByDefault: definingLibrary.isNonNullableByDefault, + ) { if (nameScope == null) { this.nameScope = LibraryScope(definingLibrary); } else { diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart index 46bde401d0b1..1c55d2eb83fb 100644 --- a/pkg/analyzer/lib/src/lint/linter.dart +++ b/pkg/analyzer/lib/src/lint/linter.dart @@ -114,7 +114,11 @@ class DartLinter implements AnalysisErrorListener { // processing gets pushed down, this hack can go away.) if (rule.reporter == null && sourceUrl != null) { var source = createSource(sourceUrl); - rule.reporter = ErrorReporter(this, source); + rule.reporter = ErrorReporter( + this, + source, + isNonNullableByDefault: false, + ); } try { spec.accept(visitor); @@ -343,15 +347,24 @@ class LinterContextImpl implements LinterContext { @override LinterConstantEvaluationResult evaluateConstant(Expression node) { - var source = currentUnit.unit.declaredElement.source; + var unitElement = currentUnit.unit.declaredElement; + var source = unitElement.source; + var libraryElement = unitElement.library; + var errorListener = RecordingErrorListener(); + var errorReporter = ErrorReporter( + errorListener, + source, + isNonNullableByDefault: libraryElement.isNonNullableByDefault, + ); + var visitor = ConstantVisitor( ConstantEvaluationEngine( typeProvider, declaredVariables, typeSystem: typeSystem, ), - ErrorReporter(errorListener, source), + errorReporter, ); var value = node.accept(visitor); @@ -364,7 +377,11 @@ class LinterContextImpl implements LinterContext { var libraryElement = unitElement.library; var listener = ConstantAnalysisErrorListener(); - var errorReporter = ErrorReporter(listener, unitElement.source); + var errorReporter = ErrorReporter( + listener, + unitElement.source, + isNonNullableByDefault: libraryElement.isNonNullableByDefault, + ); node.accept( ConstantVerifier( @@ -628,7 +645,11 @@ class SourceLinter implements DartLinter, AnalysisErrorListener { // processing gets pushed down, this hack can go away.) if (rule.reporter == null && sourceUrl != null) { var source = createSource(sourceUrl); - rule.reporter = ErrorReporter(this, source); + rule.reporter = ErrorReporter( + this, + source, + isNonNullableByDefault: false, + ); } try { spec.accept(visitor); diff --git a/pkg/analyzer/lib/src/manifest/manifest_validator.dart b/pkg/analyzer/lib/src/manifest/manifest_validator.dart index b91a4cffe477..afb06f9ac24a 100644 --- a/pkg/analyzer/lib/src/manifest/manifest_validator.dart +++ b/pkg/analyzer/lib/src/manifest/manifest_validator.dart @@ -29,7 +29,11 @@ class ManifestValidator { */ List validate(String contents, bool checkManifest) { RecordingErrorListener recorder = RecordingErrorListener(); - ErrorReporter reporter = ErrorReporter(recorder, source); + ErrorReporter reporter = ErrorReporter( + recorder, + source, + isNonNullableByDefault: false, + ); if (checkManifest) { var document = diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart index 77c19055a2c0..a7a0e3bd1208 100644 --- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart +++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart @@ -60,7 +60,11 @@ class PubspecValidator { */ List validate(Map contents) { RecordingErrorListener recorder = RecordingErrorListener(); - ErrorReporter reporter = ErrorReporter(recorder, source); + ErrorReporter reporter = ErrorReporter( + recorder, + source, + isNonNullableByDefault: false, + ); _validateDependencies(reporter, contents); _validateFlutter(reporter, contents); diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart index d4b0ae5a3a80..a12f39132d43 100644 --- a/pkg/analyzer/lib/src/task/options.dart +++ b/pkg/analyzer/lib/src/task/options.dart @@ -425,7 +425,11 @@ class OptionsFileValidator { List validate(YamlMap options) { RecordingErrorListener recorder = RecordingErrorListener(); - ErrorReporter reporter = ErrorReporter(recorder, source); + ErrorReporter reporter = ErrorReporter( + recorder, + source, + isNonNullableByDefault: false, + ); if (AnalysisEngine.ANALYSIS_OPTIONS_FILE == source.shortName) { reporter.reportError(AnalysisError( source, diff --git a/pkg/analyzer/test/error/error_reporter_test.dart b/pkg/analyzer/test/error/error_reporter_test.dart index 1b84665b4ae4..5b5b2225922a 100644 --- a/pkg/analyzer/test/error/error_reporter_test.dart +++ b/pkg/analyzer/test/error/error_reporter_test.dart @@ -24,13 +24,22 @@ class ErrorReporterTest extends DriverResolutionTest { test_creation() async { var source = TestSource(); - expect(ErrorReporter(listener, source), isNotNull); + var reporter = ErrorReporter( + listener, + source, + isNonNullableByDefault: false, + ); + expect(reporter, isNotNull); } test_reportErrorForElement_named() async { await resolveTestCode('class A {}'); var element = findElement.class_('A'); - var reporter = ErrorReporter(listener, element.source); + var reporter = ErrorReporter( + listener, + element.source, + isNonNullableByDefault: false, + ); reporter.reportErrorForElement( StaticWarningCode.CAST_TO_NON_TYPE, element, @@ -48,7 +57,11 @@ import 'dart:math'; '''); var element = findElement.import('dart:math'); - var reporter = ErrorReporter(listener, element.source); + var reporter = ErrorReporter( + listener, + element.source, + isNonNullableByDefault: false, + ); reporter.reportErrorForElement( StaticWarningCode.CAST_TO_NON_TYPE, element, @@ -61,7 +74,11 @@ import 'dart:math'; test_reportErrorForSpan() async { var source = TestSource(); - var reporter = ErrorReporter(listener, source); + var reporter = ErrorReporter( + listener, + source, + isNonNullableByDefault: false, + ); var text = ''' foo: bar @@ -110,7 +127,11 @@ main() { nullabilitySuffix: NullabilitySuffix.none, ); - var reporter = ErrorReporter(listener, firstType.element.source); + var reporter = ErrorReporter( + listener, + firstType.element.source, + isNonNullableByDefault: false, + ); reporter.reportTypeErrorForNode( StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, @@ -145,7 +166,11 @@ main() { nullabilitySuffix: NullabilitySuffix.none, ); - var reporter = ErrorReporter(listener, firstType.element.source); + var reporter = ErrorReporter( + listener, + firstType.element.source, + isNonNullableByDefault: false, + ); reporter.reportTypeErrorForNode( StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, findNode.simple('x'), @@ -174,7 +199,11 @@ main() { var fb = findNode.topLevelVariableDeclaration('fb'); var source = result.unit.declaredElement.source; - var reporter = ErrorReporter(listener, source); + var reporter = ErrorReporter( + listener, + source, + isNonNullableByDefault: false, + ); reporter.reportTypeErrorForNode( StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, findNode.simple('x'), @@ -205,7 +234,11 @@ main() { var bb = findNode.topLevelVariableDeclaration('bb'); var source = result.unit.declaredElement.source; - var reporter = ErrorReporter(listener, source); + var reporter = ErrorReporter( + listener, + source, + isNonNullableByDefault: false, + ); reporter.reportTypeErrorForNode( StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, findNode.simple('x'), diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart index b76ad9c0e55a..7639d07a5ee7 100644 --- a/pkg/analyzer/test/generated/parser_fasta_test.dart +++ b/pkg/analyzer/test/generated/parser_fasta_test.dart @@ -2088,7 +2088,11 @@ class FastaParserTestCase _fastaTokens = result.tokens; // Run parser - ErrorReporter errorReporter = ErrorReporter(listener, source); + ErrorReporter errorReporter = ErrorReporter( + listener, + source, + isNonNullableByDefault: false, + ); fasta.Parser parser = fasta.Parser(null); AstBuilder astBuilder = AstBuilder(errorReporter, source.uri, true, featureSet); @@ -3244,7 +3248,11 @@ class ParserProxy extends analyzer.ParserAdapter { {bool allowNativeClause = false, int expectedEndOffset}) { TestSource source = TestSource(); var errorListener = GatheringErrorListener(checkRanges: true); - var errorReporter = ErrorReporter(errorListener, source); + var errorReporter = ErrorReporter( + errorListener, + source, + isNonNullableByDefault: false, + ); return ParserProxy._( firstToken, errorReporter, null, errorListener, featureSet, allowNativeClause: allowNativeClause, diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart index 365c8f9b1ad4..bc6361cdbe4d 100644 --- a/pkg/analyzer/test/generated/type_system_test.dart +++ b/pkg/analyzer/test/generated/type_system_test.dart @@ -1441,8 +1441,11 @@ class GenericFunctionInferenceTest extends AbstractTypeSystemTest { {DartType returnType, bool expectError = false}) { var listener = RecordingErrorListener(); - var reporter = ErrorReporter(listener, - NonExistingSource('/test.dart', toUri('/test.dart'), UriKind.FILE_URI)); + var reporter = ErrorReporter( + listener, + NonExistingSource('/test.dart', toUri('/test.dart'), UriKind.FILE_URI), + isNonNullableByDefault: false, + ); var typeArguments = typeSystem.inferGenericFunctionOrType( typeParameters: ft.typeFormals, diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart index 1e2aa11f5c59..0f2a4eb60d42 100644 --- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart +++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart @@ -199,7 +199,11 @@ class ConstantVisitorTestSupport extends DriverResolutionTest { var source = this.result.unit.declaredElement.source; var errorListener = GatheringErrorListener(); - var errorReporter = ErrorReporter(errorListener, source); + var errorReporter = ErrorReporter( + errorListener, + source, + isNonNullableByDefault: false, + ); DartObjectImpl result = expression.accept( ConstantVisitor( diff --git a/pkg/analyzer/test/src/lint/lint_rule_test.dart b/pkg/analyzer/test/src/lint/lint_rule_test.dart index 55f62d097259..5d9a51042ded 100644 --- a/pkg/analyzer/test/src/lint/lint_rule_test.dart +++ b/pkg/analyzer/test/src/lint/lint_rule_test.dart @@ -70,7 +70,8 @@ class CollectingReporter extends ErrorReporter { ErrorCode code; CollectingReporter(AnalysisErrorListener listener, Source source) - : super(listener, source); + : super(listener, source, isNonNullableByDefault: false); + void reportErrorForElement(ErrorCode errorCode, Element element, [List arguments]) { code = errorCode; diff --git a/pkg/analyzer/test/src/options/options_rule_validator_test.dart b/pkg/analyzer/test/src/options/options_rule_validator_test.dart index 8d5514c15484..991d842e55e1 100644 --- a/pkg/analyzer/test/src/options/options_rule_validator_test.dart +++ b/pkg/analyzer/test/src/options/options_rule_validator_test.dart @@ -38,8 +38,11 @@ class OptionsRuleValidatorTest extends Object with ResourceProviderMixin { */ void assertErrors(String content, List expectedErrorCodes) { GatheringErrorListener listener = GatheringErrorListener(); - ErrorReporter reporter = - ErrorReporter(listener, StringSource(content, 'analysis_options.yaml')); + ErrorReporter reporter = ErrorReporter( + listener, + StringSource(content, 'analysis_options.yaml'), + isNonNullableByDefault: false, + ); validator.validate(reporter, loadYamlNode(content)); listener.assertErrorsWithCodes(expectedErrorCodes); }