Version 2.17.0-89.0.dev
Merge commit '62488444c9a4f3b6bfa625b5ead98bc6140fa8d5' into 'dev'
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index c182eee..853fa09 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -810,7 +810,7 @@
}
lsp.Diagnostic pluginToDiagnostic(
- server.LineInfo Function(String) getLineInfo,
+ server.LineInfo? Function(String) getLineInfo,
plugin.AnalysisError error, {
required Set<lsp.DiagnosticTag>? supportedTags,
required bool clientSupportsCodeDescription,
@@ -832,7 +832,14 @@
final range = locationToRange(error.location) ??
locationOffsetLenToRange(
- getLineInfo(error.location.file), error.location);
+ // TODO(dantup): This null assertion is not sound and can lead to
+ // errors (for example during a large rename where files may be
+ // removed as diagnostics are being mapped). To remove this,
+ // error.location should be updated to require line/col information
+ // (which involves breaking changes).
+ getLineInfo(error.location.file)!,
+ error.location,
+ );
var documentationUrl = error.url;
return lsp.Diagnostic(
range: range,
diff --git a/pkg/analysis_server/lib/src/lsp/notification_manager.dart b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
index 8f38df1..bae8def 100644
--- a/pkg/analysis_server/lib/src/lsp/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
@@ -30,9 +30,7 @@
String filePath, List<protocol.AnalysisError> errors) {
final diagnostics = errors
.map((error) => pluginToDiagnostic(
- // We should never return errors for a file we can't get a
- // LineInfo for
- (path) => server.getLineInfo(path)!,
+ (path) => server.getLineInfo(path),
error,
supportedTags: server.clientCapabilities?.diagnosticTags,
clientSupportsCodeDescription:
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index fe3cd92..9e6fc22 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -268,37 +268,6 @@
_search = Search(this);
}
- /// Create a new instance of [AnalysisDriver].
- ///
- /// The given [SourceFactory] is cloned to ensure that it does not contain a
- /// reference to a [AnalysisContext] in which it could have been used.
- @Deprecated('Use the unnamed constructor instead')
- AnalysisDriver.tmp1({
- required AnalysisDriverScheduler scheduler,
- required PerformanceLog logger,
- required ResourceProvider resourceProvider,
- required ByteStore byteStore,
- required SourceFactory sourceFactory,
- required AnalysisOptionsImpl analysisOptions,
- required Packages packages,
- FileContentCache? fileContentCache,
- bool enableIndex = false,
- SummaryDataStore? externalSummaries,
- bool retainDataForTesting = false,
- }) : this(
- scheduler: scheduler,
- logger: logger,
- resourceProvider: resourceProvider,
- byteStore: byteStore,
- sourceFactory: sourceFactory,
- analysisOptions: analysisOptions,
- packages: packages,
- fileContentCache: fileContentCache,
- enableIndex: enableIndex,
- externalSummaries: externalSummaries,
- retainDataForTesting: retainDataForTesting,
- );
-
/// Return the set of files explicitly added to analysis using [addFile].
Set<String> get addedFiles => _fileTracker.addedFiles;
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 19ca635..c5d9146 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -18,12 +18,21 @@
RequiredParametersVerifier(this._errorReporter);
@override
+ void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+ _check(
+ node.constructorElement?.parameters,
+ node.arguments?.argumentList.arguments ?? <Expression>[],
+ node.name,
+ );
+ }
+
+ @override
void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
var type = node.staticInvokeType;
if (type is FunctionType) {
_check(
type.parameters,
- node.argumentList,
+ node.argumentList.arguments,
node,
);
}
@@ -33,7 +42,7 @@
void visitInstanceCreationExpression(InstanceCreationExpression node) {
_check(
node.constructorName.staticElement?.parameters,
- node.argumentList,
+ node.argumentList.arguments,
node.constructorName,
);
}
@@ -43,14 +52,15 @@
if (node.methodName.name == FunctionElement.CALL_METHOD_NAME) {
var targetType = node.realTarget?.staticType;
if (targetType is FunctionType) {
- _check(targetType.parameters, node.argumentList, node.argumentList);
+ _check(targetType.parameters, node.argumentList.arguments,
+ node.argumentList);
return;
}
}
_check(
_executableElement(node.methodName.staticElement)?.parameters,
- node.argumentList,
+ node.argumentList.arguments,
node.methodName,
);
}
@@ -60,7 +70,7 @@
RedirectingConstructorInvocation node) {
_check(
_executableElement(node.staticElement)?.parameters,
- node.argumentList,
+ node.argumentList.arguments,
node,
);
}
@@ -69,14 +79,14 @@
void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
_check(
_executableElement(node.staticElement)?.parameters,
- node.argumentList,
+ node.argumentList.arguments,
node,
);
}
void _check(
List<ParameterElement>? parameters,
- ArgumentList argumentList,
+ List<Expression> arguments,
AstNode node,
) {
if (parameters == null) {
@@ -86,7 +96,7 @@
for (ParameterElement parameter in parameters) {
if (parameter.isRequiredNamed) {
String parameterName = parameter.name;
- if (!_containsNamedExpression(argumentList, parameterName)) {
+ if (!_containsNamedExpression(arguments, parameterName)) {
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
node,
@@ -98,7 +108,7 @@
var annotation = _requiredAnnotation(parameter);
if (annotation != null) {
String parameterName = parameter.name;
- if (!_containsNamedExpression(argumentList, parameterName)) {
+ if (!_containsNamedExpression(arguments, parameterName)) {
var reason = annotation.reason;
if (reason != null) {
_errorReporter.reportErrorForNode(
@@ -119,8 +129,10 @@
}
}
- static bool _containsNamedExpression(ArgumentList args, String name) {
- NodeList<Expression> arguments = args.arguments;
+ static bool _containsNamedExpression(
+ List<Expression> arguments,
+ String name,
+ ) {
for (int i = arguments.length - 1; i >= 0; i--) {
Expression expression = arguments[i];
if (expression is NamedExpression) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 84ae1df..36d3095 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -558,6 +558,12 @@
}
@override
+ void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+ _requiredParametersVerifier.visitEnumConstantDeclaration(node);
+ super.visitEnumConstantDeclaration(node);
+ }
+
+ @override
void visitEnumDeclaration(EnumDeclaration node) {
var outerClass = _enclosingClass;
try {
@@ -3987,6 +3993,7 @@
redirectedConstructor,
[constructorStrName, redirectedClass.name]);
}
+ _checkForInvalidGenerativeConstructorReference(redirectedConstructor);
}
/// Check whether the redirecting constructor, [element], is const, and
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 7761fe1..6253c65 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1583,20 +1583,38 @@
}
}
}
- var arguments = node.arguments;
- if (arguments != null) {
- var argumentList = arguments.argumentList;
- if (constructorElement != null) {
+ if (constructorElement != null) {
+ var arguments = node.arguments;
+ if (arguments != null) {
+ var argumentList = arguments.argumentList;
argumentList.correspondingStaticParameters =
ResolverVisitor.resolveArgumentsToParameters(
argumentList: argumentList,
parameters: constructorElement.parameters,
+ errorReporter: errorReporter,
);
for (var argument in argumentList.arguments) {
analyzeExpression(argument, argument.staticParameterElement?.type);
}
+ arguments.typeArguments?.accept(this);
+
+ var whyNotPromotedList =
+ <Map<DartType, NonPromotionReason> Function()>[];
+ checkForArgumentTypesNotAssignableInList(
+ argumentList, whyNotPromotedList);
+ } else if (definingLibrary.featureSet
+ .isEnabled(Feature.enhanced_enums)) {
+ var requiredParameterCount = constructorElement.parameters
+ .where((e) => e.isRequiredPositional)
+ .length;
+ if (requiredParameterCount != 0) {
+ errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS,
+ node.name,
+ [requiredParameterCount, 0],
+ );
+ }
}
- arguments.typeArguments?.accept(this);
}
}
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 4cde594..cf141f5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4087,11 +4087,15 @@
v = 3;
v; // marker
}''');
- if (hasAssignmentLeftResolution) {
- assertTypeDynamic(findNode.simple('v ='));
- } else {
- assertTypeNull(findNode.simple('v ='));
- }
+ assertAssignment(
+ findNode.assignment('= 3'),
+ readElement: null,
+ readType: null,
+ writeElement: findElement.localVar('v'),
+ writeType: 'dynamic',
+ operatorElement: null,
+ type: 'int',
+ );
assertTypeDynamic(findNode.simple('v; // marker'));
}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index d56b63b..82900cd 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -1522,24 +1522,13 @@
{
var prefixed = findNode.prefixed('a.v = 1;');
- if (hasAssignmentLeftResolution) {
- assertElement(prefixed, v.setter);
- assertType(prefixed, 'int');
- } else {
- assertElementNull(prefixed);
- assertTypeNull(prefixed);
- }
+ assertElementNull(prefixed);
+ assertTypeNull(prefixed);
assertElement(prefixed.prefix, import.prefix);
assertType(prefixed.prefix, null);
- if (hasAssignmentLeftResolution) {
- assertElement(prefixed.identifier, v.setter);
- assertType(prefixed.identifier, 'int');
- } else {
- assertElementNull(prefixed.identifier);
- assertTypeNull(prefixed.identifier);
- }
+ assertUnresolvedSimpleIdentifier(prefixed.identifier);
}
}
@@ -1770,13 +1759,7 @@
{
var fRef = findNode.simple('f = 1;');
- if (hasAssignmentLeftResolution) {
- assertMember(fRef, findElement.setter('f'), {'T': 'int'});
- assertType(fRef, 'int');
- } else {
- assertElementNull(fRef);
- assertTypeNull(fRef);
- }
+ assertUnresolvedSimpleIdentifier(fRef);
}
}
@@ -5944,13 +5927,7 @@
await resolveTestFile();
var xRef = findNode.simple('x ++');
- if (hasAssignmentLeftResolution) {
- assertElement(xRef, findElement.parameter('x'));
- assertType(xRef, 'int');
- } else {
- // assertElementNull(xRef);
- assertTypeNull(xRef);
- }
+ assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
}
test_postfixExpression_local() async {
@@ -5982,13 +5959,7 @@
expect(postfix.staticType, typeProvider.intType);
var operand = postfix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- expect(operand.staticElement, same(v));
- expect(operand.staticType, typeProvider.intType);
- } else {
- // expect(operand.staticElement, same(v));
- expect(operand.staticType, isNull);
- }
+ assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true);
}
}
@@ -6004,11 +5975,6 @@
addTestFile(content);
await resolveTestFile();
- CompilationUnit unit = result.unit;
-
- var cClassDeclaration = unit.declarations[1] as ClassDeclaration;
- ClassElement cClassElement = cClassDeclaration.declaredElement!;
- FieldElement fElement = cClassElement.getField('f')!;
List<Statement> mainStatements = _getMainStatements(result);
@@ -6021,20 +5987,10 @@
expect(postfix.staticType, typeProvider.intType);
var propertyAccess = postfix.operand as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- expect(propertyAccess.staticType, typeProvider.intType);
- } else {
- assertTypeNull(propertyAccess);
- }
+ assertUnresolvedPropertyAccess(propertyAccess);
SimpleIdentifier propertyName = propertyAccess.propertyName;
- if (hasAssignmentLeftResolution) {
- expect(propertyName.staticElement, same(fElement.setter));
- expect(propertyName.staticType, typeProvider.intType);
- } else {
- assertElementNull(propertyName);
- assertTypeNull(propertyName);
- }
+ assertUnresolvedSimpleIdentifier(propertyName);
}
}
@@ -6060,13 +6016,7 @@
await resolveTestFile();
var xRef = findNode.simple('x++');
- if (hasAssignmentLeftResolution) {
- assertElement(xRef, findElement.parameter('x'));
- assertType(xRef, 'int');
- } else {
- // assertElementNull(xRef);
- assertTypeNull(xRef);
- }
+ assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
}
test_prefix_increment_of_prefix_increment() async {
@@ -6078,13 +6028,7 @@
await resolveTestFile();
var xRef = findNode.simple('x;');
- if (hasAssignmentLeftResolution) {
- assertElement(xRef, findElement.parameter('x'));
- assertType(xRef, 'int');
- } else {
- // assertElementNull(xRef);
- assertTypeNull(xRef);
- }
+ assertUnresolvedSimpleIdentifier(xRef, disableElementCheck: true);
}
test_prefixedIdentifier_classInstance_instanceField() async {
@@ -6268,14 +6212,7 @@
var assignment = statement.expression as AssignmentExpression;
var left = assignment.leftHandSide as PrefixedIdentifier;
assertPrefix(left.prefix);
-
- if (hasAssignmentLeftResolution) {
- expect(left.identifier.staticElement, same(mySetter));
- expect(left.identifier.staticType, typeProvider.intType);
- } else {
- assertElementNull(left.identifier);
- assertTypeNull(left.identifier);
- }
+ assertUnresolvedSimpleIdentifier(left.identifier);
}
}
@@ -6309,13 +6246,7 @@
expect(prefix.staticType, typeProvider.intType);
var operand = prefix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- expect(operand.staticElement, same(v));
- expect(operand.staticType, typeProvider.intType);
- } else {
- // assertElementNull(operand);
- assertTypeNull(operand);
- }
+ assertUnresolvedSimpleIdentifier(operand, disableElementCheck: true);
}
{
@@ -6396,20 +6327,10 @@
expect(prefix.staticType, typeProvider.intType);
var propertyAccess = prefix.operand as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- expect(propertyAccess.staticType, typeProvider.intType);
- } else {
- assertTypeNull(propertyAccess);
- }
+ assertUnresolvedPropertyAccess(propertyAccess);
SimpleIdentifier propertyName = propertyAccess.propertyName;
- if (hasAssignmentLeftResolution) {
- expect(propertyName.staticElement, same(fElement.setter));
- expect(propertyName.staticType, typeProvider.intType);
- } else {
- assertElementNull(propertyName.staticElement);
- assertTypeNull(propertyName);
- }
+ assertUnresolvedSimpleIdentifier(propertyName);
}
{
@@ -6635,8 +6556,6 @@
var methodElement = aNode.members[0].declaredElement as MethodElement;
var getterElement =
aNode.members[1].declaredElement as PropertyAccessorElement;
- var setterElement =
- aNode.members[2].declaredElement as PropertyAccessorElement;
var operatorElement = aNode.members[3].declaredElement as MethodElement;
var testNode = bNode.members[0] as MethodDeclaration;
@@ -6694,13 +6613,7 @@
var assignment = statement.expression as AssignmentExpression;
var identifier = assignment.leftHandSide as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- expect(identifier.staticElement, same(setterElement));
- expect(identifier.staticType, typeProvider.intType);
- } else {
- assertElementNull(identifier);
- assertTypeNull(identifier);
- }
+ assertUnresolvedSimpleIdentifier(identifier);
}
// this.setter = 4;
@@ -6714,13 +6627,7 @@
expect(
target.staticType, interfaceTypeNone(bNode.declaredElement!)); // raw
- if (hasAssignmentLeftResolution) {
- expect(propertyAccess.propertyName.staticElement, same(setterElement));
- expect(propertyAccess.propertyName.staticType, typeProvider.intType);
- } else {
- assertElementNull(propertyAccess.propertyName);
- assertTypeNull(propertyAccess.propertyName);
- }
+ assertUnresolvedSimpleIdentifier(propertyAccess.propertyName);
}
// super + 5;
@@ -6763,8 +6670,6 @@
var methodElement = aNode.members[0].declaredElement as MethodElement;
var getterElement =
aNode.members[1].declaredElement as PropertyAccessorElement;
- var setterElement =
- aNode.members[2].declaredElement as PropertyAccessorElement;
var operatorElement = aNode.members[3].declaredElement as MethodElement;
var testNode = aNode.members[4] as MethodDeclaration;
@@ -6823,13 +6728,7 @@
var assignment = statement.expression as AssignmentExpression;
var identifier = assignment.leftHandSide as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- expect(identifier.staticElement, same(setterElement));
- expect(identifier.staticType, typeProvider.intType);
- } else {
- assertElementNull(identifier);
- assertTypeNull(identifier);
- }
+ assertUnresolvedSimpleIdentifier(identifier);
}
// this.setter = 4;
@@ -6842,13 +6741,7 @@
var target = propertyAccess.target as ThisExpression;
expect(target.staticType, thisTypeA); // raw
- if (hasAssignmentLeftResolution) {
- expect(propertyAccess.propertyName.staticElement, same(setterElement));
- expect(propertyAccess.propertyName.staticType, typeProvider.intType);
- } else {
- assertElementNull(propertyAccess.propertyName);
- assertTypeNull(propertyAccess.propertyName);
- }
+ assertUnresolvedSimpleIdentifier(propertyAccess.propertyName);
}
// this + 5;
@@ -8274,13 +8167,7 @@
assertTypeDynamic(postfix);
var aRef = postfix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- assertElementNull(aRef);
- assertTypeDynamic(aRef);
- } else {
- assertElementNull(aRef);
- assertTypeNull(aRef);
- }
+ assertUnresolvedSimpleIdentifier(aRef);
}
test_unresolved_postfix_operator() async {
@@ -8299,13 +8186,7 @@
assertType(postfix, 'A');
var aRef = postfix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- assertElement(aRef, findElement.topSet('a'));
- assertType(aRef, 'A');
- } else {
- assertElementNull(aRef);
- assertTypeNull(aRef);
- }
+ assertUnresolvedSimpleIdentifier(aRef);
}
test_unresolved_prefix_operand() async {
@@ -8322,13 +8203,7 @@
assertTypeDynamic(prefix);
var aRef = prefix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- assertElementNull(aRef);
- assertTypeDynamic(aRef);
- } else {
- assertElementNull(aRef);
- assertTypeNull(aRef);
- }
+ assertUnresolvedSimpleIdentifier(aRef);
}
test_unresolved_prefix_operator() async {
@@ -8347,13 +8222,7 @@
assertTypeDynamic(prefix);
var aRef = prefix.operand as SimpleIdentifier;
- if (hasAssignmentLeftResolution) {
- assertElement(aRef, findElement.topSet('a'));
- assertType(aRef, 'A');
- } else {
- assertElementNull(aRef);
- assertTypeNull(aRef);
- }
+ assertUnresolvedSimpleIdentifier(aRef);
}
test_unresolved_prefixedIdentifier_identifier() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart b/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
index 0adbdc7..11916bd 100644
--- a/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/field_formal_parameter_test.dart
@@ -28,7 +28,7 @@
test_enum() async {
await assertNoErrorsInCode(r'''
enum E {
- v;
+ v(0);
final int f;
const E(this.f);
}
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 384b9be..91bc686 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -168,14 +168,6 @@
var numPlusElement = numElement.getMethod('+')!;
var indexExpression = findNode.index('a[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: indexElement,
- writeElement: indexEqElement,
- type: 'num',
- );
- }
assertParameterElement(
indexExpression.index,
indexEqElement.parameters[0],
@@ -217,20 +209,6 @@
var doublePlusElement = doubleElement.getMethod('+')!;
var indexExpression = findNode.index('a[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: elementMatcher(
- indexElement,
- substitution: {'T': 'double'},
- ),
- writeElement: elementMatcher(
- indexEqElement,
- substitution: {'T': 'double'},
- ),
- type: 'double',
- );
- }
assertParameterElement(
indexExpression.index,
elementMatcher(
@@ -281,14 +259,6 @@
var numPlusElement = numElement.getMethod('+')!;
var indexExpression = findNode.index('a?[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: indexElement,
- writeElement: indexEqElement,
- type: 'num',
- );
- }
assertParameterElement(
indexExpression.index,
indexEqElement.parameters[0],
@@ -324,14 +294,6 @@
var indexEqElement = findElement.method('[]=');
var indexExpression = findNode.index('a[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: null,
- writeElement: indexEqElement,
- type: null,
- );
- }
assertParameterElement(
indexExpression.index,
indexEqElement.parameters[0],
@@ -364,8 +326,6 @@
}
''');
- var indexEqElement = findElement.method('[]=');
-
assertAssignment(
findNode.assignment('[0]'),
readElement: null,
@@ -386,22 +346,6 @@
type: 'A',
);
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- findNode.index('..[0]'),
- readElement: null,
- writeElement: indexEqElement,
- type: null,
- );
-
- assertIndexExpression(
- findNode.index('..[1]'),
- readElement: null,
- writeElement: indexEqElement,
- type: null,
- );
- }
-
assertType(findNode.cascade('a?'), 'A?');
}
@@ -419,17 +363,6 @@
var indexEqElement = findElement.method('[]=');
var indexExpression = findNode.index('a[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: null,
- writeElement: elementMatcher(
- indexEqElement,
- substitution: {'T': 'double'},
- ),
- type: null,
- );
- }
assertParameterElement(
indexExpression.index,
elementMatcher(
@@ -474,14 +407,6 @@
var indexEqElement = findElement.method('[]=');
var indexExpression = findNode.index('a?[0]');
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- indexExpression,
- readElement: null,
- writeElement: indexEqElement,
- type: null,
- );
- }
assertParameterElement(
indexExpression.index,
indexEqElement.parameters[0],
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index 3cfabd6..3c3c165 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -55,10 +55,6 @@
}
''');
- if (hasAssignmentLeftResolution) {
- assertType(findNode.simple('x++;'), 'A');
- }
-
assertPostfixExpression(
findNode.postfix('x++'),
readElement: findElement.parameter('x'),
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index 3408237..24948fe 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -91,10 +91,6 @@
element: findElement.method('+'),
type: 'Object',
);
-
- if (hasAssignmentLeftResolution) {
- assertType(findNode.simple('x;'), 'A');
- }
}
test_plusPlus_nullShorting() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index b9df396..998efbf 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -102,14 +102,6 @@
);
var prefixed = assignment.leftHandSide as PrefixedIdentifier;
- if (hasAssignmentLeftResolution) {
- assertPrefixedIdentifier(
- prefixed,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
assertSimpleIdentifier(
prefixed.prefix,
element: findElement.parameter('e'),
@@ -363,14 +355,6 @@
);
var prefixed = assignment.leftHandSide as PrefixedIdentifier;
- if (hasAssignmentLeftResolution) {
- assertPrefixedIdentifier(
- prefixed,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
assertSimpleIdentifier(
prefixed.prefix,
element: findElement.parameter('a'),
@@ -405,14 +389,6 @@
);
var prefixed = assignment.leftHandSide as PrefixedIdentifier;
- if (hasAssignmentLeftResolution) {
- assertPrefixedIdentifier(
- prefixed,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
assertSimpleIdentifier(
prefixed.prefix,
element: findElement.parameter('a'),
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 5c75760..d4b57a6 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -311,15 +311,6 @@
),
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'num',
- );
- }
}
test_extensionOverride_write() async {
@@ -345,19 +336,6 @@
operatorElement: null,
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
- assertSimpleIdentifierAssignmentTarget(
- propertyAccess.propertyName,
- );
}
test_functionType_call_read() async {
@@ -423,15 +401,6 @@
),
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
}
test_instanceCreation_write() async {
@@ -455,19 +424,6 @@
operatorElement: null,
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
- assertSimpleIdentifierAssignmentTarget(
- propertyAccess.propertyName,
- );
}
test_invalid_inDefaultValue_nullAware() async {
@@ -659,15 +615,6 @@
),
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'num',
- );
- }
}
test_ofExtension_write() async {
@@ -693,19 +640,6 @@
operatorElement: null,
type: 'int',
);
-
- var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
- assertSimpleIdentifierAssignmentTarget(
- propertyAccess.propertyName,
- );
}
test_super_read() async {
@@ -767,21 +701,9 @@
);
var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
assertSuperExpression(
propertyAccess.target,
);
-
- assertSimpleIdentifierAssignmentTarget(
- propertyAccess.propertyName,
- );
}
test_super_write() async {
@@ -809,21 +731,9 @@
);
var propertyAccess = assignment.leftHandSide as PropertyAccess;
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- propertyAccess,
- element: findElement.setter('foo'),
- type: 'int',
- );
- }
-
assertSuperExpression(
propertyAccess.target,
);
-
- assertSimpleIdentifierAssignmentTarget(
- propertyAccess.propertyName,
- );
}
test_targetTypeParameter_dynamicBounded() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index ee209b2..a32c4bb 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -51,9 +51,6 @@
ClassElement get futureElement => typeProvider.futureElement;
- /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
- bool get hasAssignmentLeftResolution => false;
-
ClassElement get intElement => typeProvider.intType.element;
InterfaceType get intType => typeProvider.intType;
@@ -111,6 +108,8 @@
);
assertElement(node.staticElement, operatorElement);
assertType(node, type);
+
+ _assertUnresolvedAssignmentTarget(node.leftHandSide);
}
void assertBinaryExpression(
@@ -684,6 +683,10 @@
);
assertElement(node.staticElement, element);
assertType(node, type);
+
+ if (writeElement != null) {
+ _assertUnresolvedAssignmentTarget(node.operand);
+ }
}
void assertPrefixedIdentifier(
@@ -713,6 +716,10 @@
);
assertElement(node.staticElement, element);
assertType(node, type);
+
+ if (writeElement != null) {
+ _assertUnresolvedAssignmentTarget(node.operand);
+ }
}
void assertPropertyAccess(
@@ -882,6 +889,40 @@
expect(node.staticType, isNull);
}
+ void assertUnresolvedIndexExpression(IndexExpression node) {
+ assertElementNull(node);
+ assertTypeNull(node);
+ }
+
+ void assertUnresolvedPrefixedIdentifier(PrefixedIdentifier node) {
+ assertElementNull(node);
+ assertTypeNull(node);
+ assertUnresolvedSimpleIdentifier(node.identifier);
+ }
+
+ /// TODO(scheglov) Remove [disableElementCheck]
+ void assertUnresolvedPropertyAccess(
+ PropertyAccess node, {
+ bool disableElementCheck = false,
+ }) {
+ if (!disableElementCheck) {
+ assertElementNull(node);
+ }
+ assertTypeNull(node);
+ assertUnresolvedSimpleIdentifier(node.propertyName);
+ }
+
+ /// TODO(scheglov) Remove [disableElementCheck]
+ void assertUnresolvedSimpleIdentifier(
+ SimpleIdentifier node, {
+ bool disableElementCheck = false,
+ }) {
+ if (!disableElementCheck) {
+ assertElementNull(node);
+ }
+ assertTypeNull(node);
+ }
+
/// TODO(scheglov) Remove `?` from [declaration].
Matcher elementMatcher(
Element? declaration, {
@@ -1031,6 +1072,22 @@
}
}
+ /// Nodes that are targets of an assignment should not be resolved,
+ /// instead the enclosing [CompoundAssignmentExpression] is resolved.
+ void _assertUnresolvedAssignmentTarget(Expression node) {
+ if (node is IndexExpression) {
+ assertUnresolvedIndexExpression(node);
+ } else if (node is PrefixedIdentifier) {
+ assertUnresolvedPrefixedIdentifier(node);
+ } else if (node is PropertyAccess) {
+ assertUnresolvedPropertyAccess(node);
+ } else if (node is SimpleIdentifier) {
+ assertUnresolvedSimpleIdentifier(node, disableElementCheck: true);
+ } else {
+ // Not LValue.
+ }
+ }
+
Matcher _elementMatcher(Object? elementOrMatcher) {
if (elementOrMatcher is Element) {
return _ElementMatcher(this, declaration: elementOrMatcher);
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 8711811..8112a55 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -146,8 +146,6 @@
a.foo = 0;
}
''');
- var propertyAccess = findNode.prefixed('.foo =');
-
assertAssignment(
findNode.assignment('foo ='),
readElement: null,
@@ -160,14 +158,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertMember(
- propertyAccess,
- findElement.setter('foo', of: 'E'),
- {'T': 'int'},
- );
- }
}
test_implicit_targetTypeParameter_hasBound_methodInvocation() async {
@@ -265,17 +255,6 @@
type: 'S',
);
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- findNode.propertyAccess('.test'),
- element: elementMatcher(
- findElement.setter('test'),
- substitution: {'T': 'S'},
- ),
- type: 'S',
- );
- }
-
assertTypeArgumentTypes(
findNode.methodInvocation('g()'),
['S'],
@@ -294,17 +273,6 @@
type: 'num',
);
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess2(
- findNode.propertyAccess('.test'),
- element: elementMatcher(
- findElement.setter('test'),
- substitution: {'T': 'num'},
- ),
- type: 'num',
- );
- }
-
assertTypeArgumentTypes(
findNode.methodInvocation('g()'),
['num'],
@@ -465,15 +433,6 @@
operatorElement: null,
type: 'double',
);
-
- if (hasAssignmentLeftResolution) {
- var propertyAccess = findNode.propertyAccess('.foo =');
- assertMember(
- propertyAccess,
- findElement.setter('foo', of: 'E'),
- {'T': 'num'},
- );
- }
}
test_override_inferTypeArguments_error_couldNotInfer() async {
@@ -606,14 +565,5 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- var propertyAccess = findNode.propertyAccess('.foo =');
- assertMember(
- propertyAccess,
- findElement.setter('foo', of: 'E'),
- {'T': 'int'},
- );
- }
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
index 762abe6..da65cb3 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
@@ -368,14 +368,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess(
- findNode.propertyAccess('super.foo'),
- findElement.setter('foo', of: 'A'),
- 'int',
- );
- }
}
test_propertyAccess_setter_mixin_implements() async {
@@ -432,14 +424,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess(
- findNode.propertyAccess('super.foo'),
- findElement.setter('foo', of: 'A'),
- 'int',
- );
- }
}
test_propertyAccess_setter_superHasNoSuchMethod() async {
@@ -466,14 +450,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess(
- findNode.propertyAccess('super.foo'),
- findElement.setter('foo', of: 'A'),
- 'int',
- );
- }
}
test_propertyAccess_setter_superSuperHasConcrete() async {
@@ -504,13 +480,5 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertPropertyAccess(
- findNode.propertyAccess('super.foo'),
- findElement.setter('foo', of: 'A'),
- 'int',
- );
- }
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index 79b9f6e..46fccef 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -342,11 +342,15 @@
''', [
error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 88, 1),
]);
- var access = findNode.propertyAccess('0.a');
- assertElementNull(access);
- if (hasAssignmentLeftResolution) {
- assertTypeDynamic(access);
- }
+ assertAssignment(
+ findNode.assignment('= 3'),
+ readElement: null,
+ readType: null,
+ writeElement: null,
+ writeType: 'dynamic',
+ operatorElement: null,
+ type: 'int',
+ );
}
test_unnamed_extensions() async {
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index f8b4487..432c0e1 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -85,6 +85,26 @@
''');
}
+ test_enumConstant() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v(0);
+ const E(String a);
+}
+''', [
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 13, 1),
+ ]);
+ }
+
+ test_enumConstant_implicitDouble() async {
+ await assertNoErrorsInCode(r'''
+enum E {
+ v(0);
+ const E(double a);
+}
+''');
+ }
+
test_expressionFromConstructorTearoff_withoutTypeArgs() async {
await assertNoErrorsInCode('''
class C<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
index a41afd4..a254d03 100644
--- a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
@@ -58,17 +58,17 @@
test_enum_assertBeforeRedirection() async {
await assertErrorsInCode(r'''
enum E {
- v;
+ v(0);
const E(int x) : assert(x > 0), this.name();
const E.name();
}
-''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 33, 13)]);
+''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 36, 13)]);
}
test_enum_justAssert() async {
await assertNoErrorsInCode(r'''
enum E {
- v;
+ v(0);
const E(int x) : assert(x > 0);
}
''');
@@ -77,7 +77,7 @@
test_enum_justRedirection() async {
await assertNoErrorsInCode(r'''
enum E {
- v;
+ v(0);
const E(int x) : this.name();
const E.name();
}
@@ -87,10 +87,10 @@
test_enum_redirectionBeforeAssert() async {
await assertErrorsInCode(r'''
enum E {
- v;
+ v(0);
const E(int x) : this.name(), assert(x > 0);
const E.name();
}
-''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 46, 13)]);
+''', [error(CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR, 49, 13)]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
index 74bca78..2b2b9aa 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
@@ -54,6 +54,17 @@
''', [error(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, 88, 1)]);
}
+ test_enumConstant() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v(a: 0, a: 1);
+ const E({required int a});
+}
+''', [
+ error(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, 19, 1),
+ ]);
+ }
+
test_function() async {
await assertErrorsInCode(r'''
f({a, b}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
index a1caf5d..152ae4c 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
@@ -60,6 +60,18 @@
]);
}
+ test_enumConstant() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v(0);
+ const E({int? a});
+}
+''', [
+ error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 13,
+ 1),
+ ]);
+ }
+
test_functionExpressionInvocation() async {
await assertErrorsInCode('''
main() {
@@ -126,6 +138,16 @@
]);
}
+ test_enumConstant() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v(0)
+}
+''', [
+ error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 13, 1),
+ ]);
+ }
+
test_functionExpressionInvocation() async {
await assertErrorsInCode('''
main() {
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
index 7610d43..682d603 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
@@ -86,13 +86,13 @@
test_enum_redirectionOnly() async {
await assertErrorsInCode(r'''
enum E {
- v;
+ v(0);
final int x;
const E.named();
const E(this.x) : this.named();
}
''', [
- error(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, 58,
+ error(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, 61,
6),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
index 78509a6..cc82ccb 100644
--- a/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializing_formal_for_non_existent_field_test.dart
@@ -101,12 +101,12 @@
test_enum_synthetic() async {
await assertErrorsInCode(r'''
enum E {
- v;
+ v(0);
const E(this.x);
int get x => 1;
}
''', [
- error(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 24,
+ error(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 27,
6),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index 620441c..fb52e33 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -169,13 +169,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertElement(
- findNode.simple('a = 2;'),
- findElement.setter('a'),
- );
- }
}
test_method_reference() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index fb7e87c..6144c42 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -451,7 +451,6 @@
x = null;
}
''', [
- if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 24, 5),
error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 4),
]);
}
@@ -464,7 +463,6 @@
x = null;
}
''', [
- if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 37, 5),
error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 4),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
index 913b93f..f0b91f9 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_generative_enum_constructor_test.dart
@@ -96,6 +96,22 @@
''');
}
+ test_generative_named_redirectingFactory() async {
+ await assertErrorsInCode('''
+enum E {
+ v;
+
+ const factory E() = E.named;
+ const E.named();
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR,
+ 37,
+ 7),
+ ]);
+ }
+
test_generative_unnamed_constructorReference() async {
await assertErrorsInCode('''
enum E {
@@ -174,4 +190,20 @@
}
''');
}
+
+ test_generative_unnamed_redirectingFactory() async {
+ await assertErrorsInCode('''
+enum E {
+ v;
+
+ const factory E.named() = E;
+ const E();
+}
+''', [
+ error(
+ CompileTimeErrorCode.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR,
+ 43,
+ 1),
+ ]);
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
index 604be9a..456f6d0 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
@@ -328,6 +328,28 @@
]);
}
+ test_enumConstant_withArguments() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v();
+ const E({required int a});
+}
+''', [
+ error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 11, 1),
+ ]);
+ }
+
+ test_enumConstant_withoutArguments() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v;
+ const E({required int a});
+}
+''', [
+ error(CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT, 11, 1),
+ ]);
+ }
+
test_function() async {
await assertErrorsInCode(r'''
void f({required int a}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
index 5ef58f0..5f509b3 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_generative_enum_constructor_test.dart
@@ -18,7 +18,7 @@
test_factory() async {
await assertNoErrorsInCode(r'''
enum E {
- v;
+ v(0);
factory E(int i) => values[i];
}
''');
diff --git a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
index dcb8a8f..af89c90 100644
--- a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
@@ -57,6 +57,28 @@
]);
}
+ test_enumConstant_withArgumentList() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v();
+ const E(int a);
+}
+''', [
+ error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 12, 2),
+ ]);
+ }
+
+ test_enumConstant_withoutArgumentList() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v;
+ const E(int a);
+}
+''', [
+ error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 11, 1),
+ ]);
+ }
+
test_functionExpression() async {
await assertErrorsInCode('''
main() {
diff --git a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
index be8cabb..2768242 100644
--- a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
@@ -42,13 +42,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertElement(
- findNode.simple('_foo = 0'),
- aImport.setter('_foo'),
- );
- }
}
test_typeLiteral_privateField_sameLibrary() async {
@@ -93,13 +86,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertElement(
- findNode.simple('_foo = 0'),
- aImport.setter('_foo'),
- );
- }
}
test_typeLiteral_privateSetter_differentLibrary_noGetter() async {
@@ -129,13 +115,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertElement(
- findNode.simple('_foo = 0'),
- aImport.setter('_foo'),
- );
- }
}
test_typeLiteral_privateSetter_sameLibrary() async {
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index a120a6f..0d5f71f 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -166,15 +166,6 @@
type: 'dynamic',
);
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- findNode.index('x[0]'),
- readElement: null,
- writeElement: null,
- type: 'dynamic',
- );
- }
-
assertType(findNode.binary('1 + 2'), 'int');
}
@@ -236,15 +227,6 @@
type: 'dynamic',
);
- if (hasAssignmentLeftResolution) {
- assertIndexExpression(
- findNode.index('x[0]'),
- readElement: null,
- writeElement: null,
- type: 'dynamic',
- );
- }
-
assertType(findNode.binary('1 + 2'), 'int');
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
index 96bbf01..2d7020f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_named_parameter_test.dart
@@ -41,6 +41,17 @@
]);
}
+ test_enumConstant() async {
+ await assertErrorsInCode(r'''
+enum E {
+ v(a: 0);
+ const E();
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, 13, 1),
+ ]);
+ }
+
test_function() async {
await assertErrorsInCode('''
f({a, b}) {}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 44ea839..3ef5688 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -430,13 +430,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- var assignment1 = findNode.assignment('b.a?.x = 1');
- var assignment2 = findNode.assignment('b.a.x = 2');
- assertType(assignment1.leftHandSide, 'int');
- assertType(assignment2.leftHandSide, 'int');
- }
}
test_assignment_eq_simpleIdentifier() async {
@@ -466,13 +459,6 @@
operatorElement: null,
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- var assignment1 = findNode.assignment('x =');
- var assignment2 = findNode.assignment('y =');
- assertType(assignment1.leftHandSide, 'int');
- assertType(assignment2.leftHandSide, 'int?');
- }
}
test_assignment_plusEq_propertyAccess3() async {
@@ -522,13 +508,6 @@
),
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- var assignment1 = findNode.assignment('b.a.x +=');
- var assignment2 = findNode.assignment('b.a.y +=');
- assertType(assignment1.leftHandSide, 'int');
- assertType(assignment2.leftHandSide, 'int?');
- }
}
test_assignment_plusEq_propertyAccess3_short1() async {
@@ -578,13 +557,6 @@
),
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- var assignment1 = findNode.assignment('b.a?.x += 1');
- var assignment2 = findNode.assignment('b.a.x += 2');
- assertType(assignment1.leftHandSide, 'int');
- assertType(assignment2.leftHandSide, 'int');
- }
}
test_assignment_plusEq_simpleIdentifier() async {
@@ -597,8 +569,6 @@
error(CompileTimeErrorCode.UNCHECKED_METHOD_INVOCATION_OF_NULLABLE_VALUE,
33, 2),
]);
- var assignment1 = findNode.assignment('x +=');
- var assignment2 = findNode.assignment('y +=');
assertAssignment(
findNode.assignment('x +='),
@@ -625,11 +595,6 @@
),
type: 'int',
);
-
- if (hasAssignmentLeftResolution) {
- assertType(assignment1.leftHandSide, 'int');
- assertType(assignment2.leftHandSide, 'int?');
- }
}
test_await_nonNullable() async {
diff --git a/tools/VERSION b/tools/VERSION
index 19b9b02..a12a574 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 88
+PRERELEASE 89
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/linux_dist_support/upload_debian_packages.py b/tools/linux_dist_support/upload_debian_packages.py
index ab3c911..13deeb9 100755
--- a/tools/linux_dist_support/upload_debian_packages.py
+++ b/tools/linux_dist_support/upload_debian_packages.py
@@ -37,12 +37,16 @@
if __name__ == '__main__':
bot_name = os.environ.get('BUILDBOT_BUILDERNAME')
channel = bot_utils.GetChannelFromName(bot_name)
- if channel not in (bot_utils.Channel.BLEEDING_EDGE, bot_utils.Channel.TRY):
+ if os.environ.get('DART_EXPERIMENTAL_BUILD') == '1':
+ print('Not uploading artifacts on experimental builds')
+ elif channel == bot_utils.Channel.TRY:
+ print('Not uploading artifacts on try builds')
+ elif channel == bot_utils.Channel.BLEEDING_EDGE:
+ print('Not uploading artifacts on bleeding edge')
+ else:
builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
'src_and_installation')
version = utils.GetVersion()
tarfilename = 'dart-%s.tar.gz' % version
tarfile = os.path.join(builddir, tarfilename)
ArchiveArtifacts(tarfile, builddir, channel)
- else:
- print('Not uploading artifacts on bleeding edge')