From 3564f5c16343c2a774817ae4c8bcb616c3e7015b Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Wed, 9 Aug 2023 16:02:20 +0000 Subject: [PATCH] Issue 53142. Ignore pre-release field when reporting sdk_version_since. Bug: https://github.com/dart-lang/sdk/issues/53142 Change-Id: Ifeff83ef56cd560a850e012bcabfebf63c391353 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/319302 Reviewed-by: Brian Wilkerson Reviewed-by: Phil Quitslund Commit-Queue: Konstantin Shcheglov --- .../src/dart/analysis/library_analyzer.dart | 7 ++- .../lib/src/hint/sdk_constraint_verifier.dart | 20 +------ .../lib/src/utilities/extensions/version.dart | 54 +++++++++++++++++++ .../diagnostics/sdk_version_since_test.dart | 15 ++++++ 4 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 pkg/analyzer/lib/src/utilities/extensions/version.dart diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart index 4a69c27f581..bb898c09e1c 100644 --- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart +++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart @@ -48,6 +48,7 @@ import 'package:analyzer/src/lint/linter_visitor.dart'; import 'package:analyzer/src/services/lint.dart'; import 'package:analyzer/src/task/strong/checker.dart'; import 'package:analyzer/src/util/performance/operation_performance.dart'; +import 'package:analyzer/src/utilities/extensions/version.dart'; import 'package:collection/collection.dart'; import 'package:path/path.dart' as path; @@ -478,7 +479,11 @@ class LibraryAnalyzer { var sdkVersionConstraint = _analysisOptions.sdkVersionConstraint; if (sdkVersionConstraint != null) { SdkConstraintVerifier verifier = SdkConstraintVerifier( - errorReporter, _libraryElement, _typeProvider, sdkVersionConstraint); + errorReporter, + _libraryElement, + _typeProvider, + sdkVersionConstraint.withoutPreRelease, + ); unit.accept(verifier); } } diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart index 165ac0daf01..466bc696bac 100644 --- a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart +++ b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart @@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/error/codes.dart'; +import 'package:analyzer/src/utilities/extensions/version.dart'; import 'package:pub_semver/pub_semver.dart'; /// A visitor that finds code that assumes a later version of the SDK than the @@ -253,22 +254,3 @@ class SdkConstraintVerifier extends RecursiveAstVisitor { } } } - -extension on VersionConstraint { - bool requiresAtLeast(Version version) { - final self = this; - if (self is Version) { - return self >= version; - } - if (self is VersionRange) { - final min = self.min; - if (min == null) { - return false; - } else { - return min >= version; - } - } - // We don't know, but will not complain. - return true; - } -} diff --git a/pkg/analyzer/lib/src/utilities/extensions/version.dart b/pkg/analyzer/lib/src/utilities/extensions/version.dart new file mode 100644 index 00000000000..fe3cab8fa75 --- /dev/null +++ b/pkg/analyzer/lib/src/utilities/extensions/version.dart @@ -0,0 +1,54 @@ +// Copyright (c) 2023, 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:pub_semver/pub_semver.dart'; + +extension VersionConstraintExtension on VersionConstraint { + /// The same constraint, but only with major, minor, patch fields. + /// + /// Excludes pre-release and build fields, useful when developing against + /// not yet release version of Dart SDK. + VersionConstraint get withoutPreRelease { + switch (this) { + case Version version: + return version.withoutPreRelease; + case VersionRange range: + return VersionRange( + min: range.min?.withoutPreRelease, + includeMin: range.includeMin, + max: range.max?.withoutPreRelease, + includeMax: range.includeMax, + ); + default: + return this; + } + } + + bool requiresAtLeast(Version version) { + final self = this; + if (self is Version) { + return self >= version; + } + if (self is VersionRange) { + final min = self.min; + if (min == null) { + return false; + } else { + return min >= version; + } + } + // We don't know, but will not complain. + return true; + } +} + +extension VersionExtension on Version { + /// The same version, but only with major, minor, patch fields. + /// + /// Excludes pre-release and build fields, useful when developing against + /// not yet release version of Dart SDK. + Version get withoutPreRelease { + return Version(major, minor, patch); + } +} diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_since_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_since_test.dart index b69dcdf0225..4a462d37df3 100644 --- a/pkg/analyzer/test/src/diagnostics/sdk_version_since_test.dart +++ b/pkg/analyzer/test/src/diagnostics/sdk_version_since_test.dart @@ -654,6 +654,21 @@ class A {} await verifyVersion('>=2.15.0', ''' import 'dart:foo'; +void f(A a) {} +'''); + } + + test_constraints_greaterOrEq_equal_preRelease() async { + _addDartFooLibrary(r''' +import 'dart:_internal'; + +@Since('2.15') +class A {} +'''); + + await verifyVersion('>=2.15.0-pre', ''' +import 'dart:foo'; + void f(A a) {} '''); }