Issue 39059. Check for minor / major version overflow.
Bug: https://github.com/dart-lang/sdk/issues/39059 Change-Id: I78a5598b2433d772409a41f7c6e87b32f859c6be Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/131705 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
12310ebcc0
commit
96cbfb4a2c
@@ -4,9 +4,9 @@
|
||||
|
||||
import 'package:_fe_analyzer_shared/src/scanner/errors.dart'
|
||||
show translateErrorToken;
|
||||
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
|
||||
import 'package:_fe_analyzer_shared/src/scanner/token.dart'
|
||||
show Token, TokenType;
|
||||
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
|
||||
import 'package:analyzer/dart/analysis/features.dart';
|
||||
import 'package:analyzer/error/error.dart';
|
||||
import 'package:analyzer/error/listener.dart';
|
||||
@@ -190,9 +190,11 @@ class Scanner {
|
||||
void _languageVersionChanged(
|
||||
fasta.Scanner scanner, fasta.LanguageVersionToken languageVersion) {
|
||||
if (_featureSet != null) {
|
||||
_featureSet = _featureSet.restrictToVersion(
|
||||
Version(languageVersion.major, languageVersion.minor, 0));
|
||||
scanner.configuration = buildConfig(_featureSet);
|
||||
if (languageVersion.major >= 0 && languageVersion.minor >= 0) {
|
||||
_featureSet = _featureSet.restrictToVersion(
|
||||
Version(languageVersion.major, languageVersion.minor, 0));
|
||||
scanner.configuration = buildConfig(_featureSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,11 +5,14 @@
|
||||
import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
|
||||
import 'package:analyzer/dart/analysis/features.dart';
|
||||
import 'package:analyzer/dart/ast/token.dart';
|
||||
import 'package:analyzer/error/listener.dart';
|
||||
import 'package:analyzer/source/line_info.dart';
|
||||
import 'package:analyzer/src/dart/ast/token.dart';
|
||||
import 'package:analyzer/src/dart/scanner/reader.dart';
|
||||
import 'package:analyzer/src/dart/scanner/scanner.dart';
|
||||
import 'package:analyzer/src/generated/source.dart';
|
||||
import 'package:analyzer/src/string_source.dart';
|
||||
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
||||
|
||||
@@ -18,6 +21,7 @@ import 'test_support.dart';
|
||||
main() {
|
||||
defineReflectiveSuite(() {
|
||||
defineReflectiveTests(LineInfoTest);
|
||||
defineReflectiveTests(ScannerTest);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -183,6 +187,49 @@ class LineInfoTest {
|
||||
}
|
||||
}
|
||||
|
||||
@reflectiveTest
|
||||
class ScannerTest with ResourceProviderMixin {
|
||||
test_featureSet() {
|
||||
var scanner = _createScanner(r'''
|
||||
// @dart = 2.0
|
||||
''');
|
||||
var defaultFeatureSet = FeatureSet.fromEnableFlags([]);
|
||||
expect(defaultFeatureSet.isEnabled(Feature.extension_methods), isTrue);
|
||||
|
||||
scanner.configureFeatures(FeatureSet.forTesting());
|
||||
scanner.tokenize();
|
||||
|
||||
var featureSet = scanner.featureSet;
|
||||
expect(featureSet.isEnabled(Feature.extension_methods), isFalse);
|
||||
}
|
||||
|
||||
test_featureSet_majorOverflow() {
|
||||
var scanner = _createScanner(r'''
|
||||
// @dart = 99999999999999999999999999999999.0
|
||||
''');
|
||||
scanner.configureFeatures(FeatureSet.forTesting());
|
||||
scanner.tokenize();
|
||||
// Don't check features, but should not crash.
|
||||
}
|
||||
|
||||
test_featureSet_minorOverflow() {
|
||||
var scanner = _createScanner(r'''
|
||||
// @dart = 2.99999999999999999999999999999999
|
||||
''');
|
||||
scanner.configureFeatures(FeatureSet.forTesting());
|
||||
scanner.tokenize();
|
||||
// Don't check features, but should not crash.
|
||||
}
|
||||
|
||||
Scanner _createScanner(String content) {
|
||||
var path = convertPath('/test/lib/a.dart');
|
||||
var source = StringSource(content, path);
|
||||
var reader = CharSequenceReader(content);
|
||||
var errorCollector = RecordingErrorListener();
|
||||
return Scanner(source, reader, errorCollector);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An `ExpectedLocation` encodes information about the expected location of a
|
||||
* given offset in source code.
|
||||
|
||||
Reference in New Issue
Block a user