Version 2.19.0-67.0.dev
Merge commit '8e5c197d42c0ac4edea69adc17c107d0b8cc0132' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index ef918ea..99c6450 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -63,7 +63,7 @@
var library = constant.library as LibraryElementImpl;
if (constant is ParameterElementImpl) {
- if (constant.isOptional) {
+ if (constant is ConstVariableElement) {
var defaultValue = constant.constantInitializer;
if (defaultValue != null) {
RecordingErrorListener errorListener = RecordingErrorListener();
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index bc1414f..40c90d5 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -5,10 +5,13 @@
@deprecated
library analyzer.test.constant_test;
+import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -372,6 +375,46 @@
await _assertValueInt(-42, "-42");
}
+ /// Even though it is an error to specify a default value for a required
+ /// parameter, we still can evaluate it.
+ test_normalParameter_requiredNamed_hasDefault() async {
+ final a = newFile('$testPackageLibPath/a.dart', r'''
+class A {
+ A({required int x = 42});
+}
+''');
+
+ final unitResult = await _getUnitElement(a);
+ final x = unitResult.findElement.parameter('x');
+ assertDartObjectText(
+ x.computeConstantValue(),
+ r'''
+int 42
+''',
+ libraryElement: unitResult.library,
+ );
+ }
+
+ /// Even though it is an error to specify a default value for a required
+ /// parameter, we still can evaluate it.
+ test_normalParameter_requiredNamed_noDefault() async {
+ final a = newFile('$testPackageLibPath/a.dart', r'''
+class A {
+ A({required int? x});
+}
+''');
+
+ final unitResult = await _getUnitElement(a);
+ final x = unitResult.findElement.parameter('x');
+ assertDartObjectText(
+ x.computeConstantValue(),
+ r'''
+Null null
+''',
+ libraryElement: unitResult.library,
+ );
+ }
+
test_notEqual_boolean_boolean() async {
await _assertValueBool(true, "true != false");
}
@@ -927,12 +970,31 @@
return evaluator.evaluate(expression);
}
+ Future<_UnitElementResult> _getUnitElement(File file) async {
+ final analysisSession = contextFor(file).currentSession;
+ final unitResult = await analysisSession.getUnitElement(file.path);
+ unitResult as UnitElementResult;
+ return _UnitElementResult(unitResult.element);
+ }
+
EvaluationResultImpl _topVarConstResult(String name) {
var element = findElement.topVar(name) as ConstTopLevelVariableElementImpl;
return element.evaluationResult!;
}
}
+class _UnitElementResult {
+ final CompilationUnitElement element;
+
+ _UnitElementResult(this.element);
+
+ PartFindElement get findElement {
+ return PartFindElement(element);
+ }
+
+ LibraryElement get library => element.library;
+}
+
extension on VariableElement {
EvaluationResultImpl get evaluationResult {
var constVariable = this as ConstVariableElement;
diff --git a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
index ec37e39..40861f1 100644
--- a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
+++ b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
@@ -36,6 +36,8 @@
} else if (type.isDartCoreInt) {
sink.write('int ');
sink.writeln(object.toIntValue());
+ } else if (type.isDartCoreNull) {
+ sink.writeln('Null null');
} else if (type.isDartCoreString) {
sink.write('String ');
sink.writeln(object.toStringValue());
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 4d9ad77..e369510 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -120,11 +120,17 @@
);
}
- void assertDartObjectText(DartObject? object, String expected) {
+ void assertDartObjectText(
+ DartObject? object,
+ String expected, {
+ LibraryElement? libraryElement,
+ }) {
+ libraryElement ??= result.libraryElement;
+
var buffer = StringBuffer();
DartObjectPrinter(
sink: buffer,
- selfUriStr: '${result.libraryElement.source.uri}',
+ selfUriStr: '${libraryElement.source.uri}',
).write(object as DartObjectImpl?);
var actual = buffer.toString();
if (actual != expected) {
diff --git a/tools/VERSION b/tools/VERSION
index 458ff10..9f9c040 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 19
PATCH 0
-PRERELEASE 66
+PRERELEASE 67
PRERELEASE_PATCH 0
\ No newline at end of file