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:
Konstantin Shcheglov
2020-01-14 20:08:13 +00:00
committed by commit-bot@chromium.org
parent 12310ebcc0
commit 96cbfb4a2c
2 changed files with 53 additions and 4 deletions
@@ -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.