@@ -1378,31 +1378,15 @@ class AstBuilder extends StackListener {
13781378 var bodyObject = pop ();
13791379 pop (); // initializers
13801380 pop (); // separator
1381- var parameters = pop () as FormalParameterListImpl ? ;
1381+ var formalParameters = pop () as FormalParameterListImpl ? ;
13821382 var typeParameters = pop () as TypeParameterListImpl ? ;
13831383 var name = pop ();
13841384 var returnType = pop () as TypeAnnotationImpl ? ;
13851385 var modifiers = pop () as _Modifiers ? ;
13861386 var metadata = pop () as List <AnnotationImpl >? ;
13871387 var comment = _findComment (metadata, beginToken);
13881388
1389- assert (parameters != null || optional ('get' , getOrSet! ));
1390-
1391- FunctionBodyImpl body;
1392- if (bodyObject is FunctionBodyImpl ) {
1393- body = bodyObject;
1394- } else if (bodyObject is _RedirectingFactoryBody ) {
1395- body = EmptyFunctionBodyImpl (semicolon: endToken);
1396- } else {
1397- internalProblem (
1398- templateInternalProblemUnhandled.withArguments (
1399- "${bodyObject .runtimeType }" ,
1400- "bodyObject" ,
1401- ),
1402- beginToken.charOffset,
1403- uri,
1404- );
1405- }
1389+ assert (formalParameters != null || optional ('get' , getOrSet! ));
14061390
14071391 Token ? operatorKeyword;
14081392 SimpleIdentifierImpl nameId;
@@ -1424,7 +1408,27 @@ class AstBuilder extends StackListener {
14241408 );
14251409 }
14261410
1427- checkFieldFormalParameters (parameters);
1411+ if (getOrSet? .keyword == Keyword .SET ) {
1412+ formalParameters = _ensureSetterFormalParameter (nameId, formalParameters);
1413+ }
1414+
1415+ FunctionBodyImpl body;
1416+ if (bodyObject is FunctionBodyImpl ) {
1417+ body = bodyObject;
1418+ } else if (bodyObject is _RedirectingFactoryBody ) {
1419+ body = EmptyFunctionBodyImpl (semicolon: endToken);
1420+ } else {
1421+ internalProblem (
1422+ templateInternalProblemUnhandled.withArguments (
1423+ "${bodyObject .runtimeType }" ,
1424+ "bodyObject" ,
1425+ ),
1426+ beginToken.charOffset,
1427+ uri,
1428+ );
1429+ }
1430+
1431+ checkFieldFormalParameters (formalParameters);
14281432 _classLikeBuilder? .members.add (
14291433 MethodDeclarationImpl (
14301434 comment: comment,
@@ -1437,7 +1441,7 @@ class AstBuilder extends StackListener {
14371441 operatorKeyword: operatorKeyword,
14381442 name: nameId.token,
14391443 typeParameters: typeParameters,
1440- parameters: parameters ,
1444+ parameters: formalParameters ,
14411445 body: body,
14421446 ),
14431447 );
@@ -3615,7 +3619,7 @@ class AstBuilder extends StackListener {
36153619 debugEvent ("TopLevelMethod" );
36163620
36173621 var body = pop () as FunctionBodyImpl ;
3618- var parameters = pop () as FormalParameterListImpl ? ;
3622+ var formalParameters = pop () as FormalParameterListImpl ? ;
36193623 var typeParameters = pop () as TypeParameterListImpl ? ;
36203624 var name = pop () as SimpleIdentifierImpl ;
36213625 var returnType = pop () as TypeAnnotationImpl ? ;
@@ -3624,6 +3628,11 @@ class AstBuilder extends StackListener {
36243628 var externalKeyword = modifiers? .externalKeyword;
36253629 var metadata = pop () as List <AnnotationImpl >? ;
36263630 var comment = _findComment (metadata, beginToken);
3631+
3632+ if (getOrSet? .keyword == Keyword .SET ) {
3633+ formalParameters = _ensureSetterFormalParameter (name, formalParameters);
3634+ }
3635+
36273636 declarations.add (
36283637 FunctionDeclarationImpl (
36293638 comment: comment,
@@ -3635,7 +3644,7 @@ class AstBuilder extends StackListener {
36353644 name: name.token,
36363645 functionExpression: FunctionExpressionImpl (
36373646 typeParameters: typeParameters,
3638- parameters: parameters ,
3647+ parameters: formalParameters ,
36393648 body: body,
36403649 ),
36413650 ),
@@ -6229,6 +6238,61 @@ class AstBuilder extends StackListener {
62296238 return constructor;
62306239 }
62316240
6241+ FormalParameterListImpl ? _ensureSetterFormalParameter (
6242+ SimpleIdentifierImpl setterName,
6243+ FormalParameterListImpl ? formalParameters,
6244+ ) {
6245+ formalParameters ?? =
6246+ throw StateError ('Parser has recovery, this never happens.' );
6247+
6248+ var valueFormalParameter = formalParameters.parameters.firstOrNull;
6249+ if (valueFormalParameter == null ) {
6250+ if (! formalParameters.leftParenthesis.isSynthetic) {
6251+ diagnosticReporter.diagnosticReporter? .atToken (
6252+ setterName.token,
6253+ ParserErrorCode .WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER ,
6254+ );
6255+ }
6256+ var valueNameToken = parser.rewriter.insertSyntheticIdentifier (
6257+ formalParameters.leftParenthesis,
6258+ );
6259+ return FormalParameterListImpl (
6260+ leftParenthesis: formalParameters.leftParenthesis,
6261+ parameters: [
6262+ SimpleFormalParameterImpl (
6263+ comment: null ,
6264+ metadata: null ,
6265+ covariantKeyword: null ,
6266+ requiredKeyword: null ,
6267+ keyword: null ,
6268+ type: null ,
6269+ name: valueNameToken,
6270+ ),
6271+ ],
6272+ leftDelimiter: null ,
6273+ rightDelimiter: null ,
6274+ rightParenthesis: formalParameters.rightParenthesis,
6275+ );
6276+ }
6277+
6278+ if (valueFormalParameter.isRequiredPositional &&
6279+ formalParameters.parameters.length == 1 ) {
6280+ return formalParameters;
6281+ }
6282+
6283+ diagnosticReporter.diagnosticReporter? .atToken (
6284+ setterName.token,
6285+ ParserErrorCode .WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER ,
6286+ );
6287+ return FormalParameterListImpl (
6288+ leftParenthesis: formalParameters.leftParenthesis,
6289+ parameters: [valueFormalParameter.notDefault],
6290+ leftDelimiter: null ,
6291+ rightDelimiter: null ,
6292+ rightParenthesis: formalParameters.rightParenthesis,
6293+ );
6294+ }
6295+
62326296 CommentImpl ? _findComment (
62336297 List <AnnotationImpl >? metadata,
62346298 Token tokenAfterMetadata,
0 commit comments