@@ -220,20 +220,21 @@ abstract class Generator {
220
220
{bool isTypeArgumentsInForest = false });
221
221
222
222
Expression_Generator buildSelectorAccess (
223
- Selector send, int operatorOffset, bool isNullAware) {
224
- if (send is InvocationSelector ) {
225
- return _helper.buildMethodInvocation (buildSimpleRead (), send.name,
226
- send.arguments, offsetForToken (send.token),
223
+ Selector selector, int operatorOffset, bool isNullAware) {
224
+ selector.reportNewAsSelector ();
225
+ if (selector is InvocationSelector ) {
226
+ return _helper.buildMethodInvocation (buildSimpleRead (), selector.name,
227
+ selector.arguments, offsetForToken (selector.token),
227
228
isNullAware: isNullAware,
228
- isConstantExpression: send .isPotentiallyConstant);
229
+ isConstantExpression: selector .isPotentiallyConstant);
229
230
} else {
230
231
if (_helper.constantContext != ConstantContext .none &&
231
- send .name != lengthName) {
232
+ selector .name != lengthName) {
232
233
_helper.addProblem (
233
234
messageNotAConstantExpression, fileOffset, token.length);
234
235
}
235
- return PropertyAccessGenerator .make (
236
- _helper, send.token, buildSimpleRead (), send .name, isNullAware);
236
+ return PropertyAccessGenerator .make (_helper, selector.token,
237
+ buildSimpleRead (), selector .name, isNullAware);
237
238
}
238
239
}
239
240
@@ -2642,17 +2643,18 @@ class ExplicitExtensionAccessGenerator extends Generator {
2642
2643
2643
2644
@override
2644
2645
Expression_Generator buildSelectorAccess (
2645
- Selector send, int operatorOffset, bool isNullAware) {
2646
+ Selector selector, int operatorOffset, bool isNullAware) {
2647
+ selector.reportNewAsSelector ();
2646
2648
if (_helper.constantContext != ConstantContext .none) {
2647
2649
_helper.addProblem (
2648
2650
messageNotAConstantExpression, fileOffset, token.length);
2649
2651
}
2650
- Generator generator =
2651
- _createInstanceAccess (send.token, send.name, isNullAware: isNullAware);
2652
- if (send .arguments != null ) {
2653
- return generator.doInvocation (offsetForToken (send .token),
2654
- send .typeArguments, send .arguments! as ArgumentsImpl ,
2655
- isTypeArgumentsInForest: send .isTypeArgumentsInForest);
2652
+ Generator generator = _createInstanceAccess (selector.token, selector.name,
2653
+ isNullAware: isNullAware);
2654
+ if (selector .arguments != null ) {
2655
+ return generator.doInvocation (offsetForToken (selector .token),
2656
+ selector .typeArguments, selector .arguments! as ArgumentsImpl ,
2657
+ isTypeArgumentsInForest: selector .isTypeArgumentsInForest);
2656
2658
} else {
2657
2659
return generator;
2658
2660
}
@@ -2878,9 +2880,10 @@ class DeferredAccessGenerator extends Generator {
2878
2880
2879
2881
@override
2880
2882
Expression_Generator buildSelectorAccess (
2881
- Selector send, int operatorOffset, bool isNullAware) {
2882
- Object propertyAccess =
2883
- suffixGenerator.buildSelectorAccess (send, operatorOffset, isNullAware);
2883
+ Selector selector, int operatorOffset, bool isNullAware) {
2884
+ selector.reportNewAsSelector ();
2885
+ Object propertyAccess = suffixGenerator.buildSelectorAccess (
2886
+ selector, operatorOffset, isNullAware);
2884
2887
if (propertyAccess is Generator ) {
2885
2888
return new DeferredAccessGenerator (
2886
2889
_helper, token, prefixGenerator, propertyAccess);
@@ -4059,14 +4062,15 @@ class PrefixUseGenerator extends Generator {
4059
4062
4060
4063
@override
4061
4064
Expression_Generator buildSelectorAccess (
4062
- Selector send, int operatorOffset, bool isNullAware) {
4063
- assert (send.name.text == send.token.lexeme,
4064
- "'${send .name .text }' != ${send .token .lexeme }" );
4065
- Object result = qualifiedLookup (send.token);
4066
- if (send is InvocationSelector ) {
4067
- result = _helper.finishSend (result, send.typeArguments,
4068
- send.arguments as ArgumentsImpl , send.fileOffset,
4069
- isTypeArgumentsInForest: send.isTypeArgumentsInForest);
4065
+ Selector selector, int operatorOffset, bool isNullAware) {
4066
+ assert (selector.name.text == selector.token.lexeme,
4067
+ "'${selector .name .text }' != ${selector .token .lexeme }" );
4068
+ selector.reportNewAsSelector ();
4069
+ Object result = qualifiedLookup (selector.token);
4070
+ if (selector is InvocationSelector ) {
4071
+ result = _helper.finishSend (result, selector.typeArguments,
4072
+ selector.arguments as ArgumentsImpl , selector.fileOffset,
4073
+ isTypeArgumentsInForest: selector.isTypeArgumentsInForest);
4070
4074
}
4071
4075
if (isNullAware) {
4072
4076
result = _helper.wrapInLocatedProblem (
@@ -4442,21 +4446,22 @@ class ThisAccessGenerator extends Generator {
4442
4446
4443
4447
@override
4444
4448
Expression_Generator buildSelectorAccess (
4445
- Selector send , int operatorOffset, bool isNullAware) {
4446
- Name name = send .name;
4447
- Arguments ? arguments = send .arguments;
4448
- int offset = offsetForToken (send .token);
4449
- if (isInitializer && send is InvocationSelector ) {
4449
+ Selector selector , int operatorOffset, bool isNullAware) {
4450
+ Name name = selector .name;
4451
+ Arguments ? arguments = selector .arguments;
4452
+ int offset = offsetForToken (selector .token);
4453
+ if (isInitializer && selector is InvocationSelector ) {
4450
4454
if (isNullAware) {
4451
4455
_helper.addProblem (
4452
4456
messageInvalidUseOfNullAwareAccess, operatorOffset, 2 );
4453
4457
}
4454
4458
return buildConstructorInitializer (offset, name, arguments! );
4455
4459
}
4460
+ selector.reportNewAsSelector ();
4456
4461
if (inFieldInitializer && ! inLateFieldInitializer && ! isInitializer) {
4457
4462
return buildFieldInitializerError (null );
4458
4463
}
4459
- if (send is InvocationSelector ) {
4464
+ if (selector is InvocationSelector ) {
4460
4465
// Notice that 'this' or 'super' can't be null. So we can ignore the
4461
4466
// value of [isNullAware].
4462
4467
if (isNullAware) {
@@ -4465,8 +4470,8 @@ class ThisAccessGenerator extends Generator {
4465
4470
return _helper.buildMethodInvocation (
4466
4471
_forest.createThisExpression (fileOffset),
4467
4472
name,
4468
- send .arguments,
4469
- offsetForToken (send .token),
4473
+ selector .arguments,
4474
+ offsetForToken (selector .token),
4470
4475
isSuper: isSuper);
4471
4476
} else {
4472
4477
if (isSuper) {
@@ -4476,15 +4481,15 @@ class ThisAccessGenerator extends Generator {
4476
4481
return new SuperPropertyAccessGenerator (
4477
4482
_helper,
4478
4483
// TODO(ahe): This is not the 'super' token.
4479
- send .token,
4484
+ selector .token,
4480
4485
name,
4481
4486
getter,
4482
4487
setter);
4483
4488
} else {
4484
4489
return new ThisPropertyAccessGenerator (
4485
4490
_helper,
4486
4491
// TODO(ahe): This is not the 'this' token.
4487
- send .token,
4492
+ selector .token,
4488
4493
name,
4489
4494
thisOffset: fileOffset,
4490
4495
isNullAware: isNullAware);
@@ -4751,20 +4756,21 @@ class ParenthesizedExpressionGenerator extends AbstractReadOnlyAccessGenerator {
4751
4756
4752
4757
@override
4753
4758
Expression_Generator buildSelectorAccess (
4754
- Selector send, int operatorOffset, bool isNullAware) {
4755
- if (send is InvocationSelector ) {
4756
- return _helper.buildMethodInvocation (
4757
- _createRead (), send.name, send.arguments, offsetForToken (send.token),
4759
+ Selector selector, int operatorOffset, bool isNullAware) {
4760
+ selector.reportNewAsSelector ();
4761
+ if (selector is InvocationSelector ) {
4762
+ return _helper.buildMethodInvocation (_createRead (), selector.name,
4763
+ selector.arguments, offsetForToken (selector.token),
4758
4764
isNullAware: isNullAware,
4759
- isConstantExpression: send .isPotentiallyConstant);
4765
+ isConstantExpression: selector .isPotentiallyConstant);
4760
4766
} else {
4761
4767
if (_helper.constantContext != ConstantContext .none &&
4762
- send .name != lengthName) {
4768
+ selector .name != lengthName) {
4763
4769
_helper.addProblem (
4764
4770
messageNotAConstantExpression, fileOffset, token.length);
4765
4771
}
4766
4772
return PropertyAccessGenerator .make (
4767
- _helper, send .token, _createRead (), send .name, isNullAware);
4773
+ _helper, selector .token, _createRead (), selector .name, isNullAware);
4768
4774
}
4769
4775
}
4770
4776
}
@@ -4822,6 +4828,14 @@ abstract class Selector {
4822
4828
4823
4829
void printOn (StringSink sink);
4824
4830
4831
+ /// Report an error if the selector name "new" when the constructor-tearoff
4832
+ /// feature is enabled.
4833
+ void reportNewAsSelector () {
4834
+ if (name.text == 'new' && _helper.enableConstructorTearOffsInLibrary) {
4835
+ _helper.addProblem (messageNewAsSelector, fileOffset, name.text.length);
4836
+ }
4837
+ }
4838
+
4825
4839
@override
4826
4840
String toString () {
4827
4841
StringBuffer buffer = new StringBuffer ();
@@ -4875,6 +4889,7 @@ class InvocationSelector extends Selector {
4875
4889
if (receiver is Generator ) {
4876
4890
return receiver.buildSelectorAccess (this , operatorOffset, isNullAware);
4877
4891
}
4892
+ reportNewAsSelector ();
4878
4893
return _helper.buildMethodInvocation (
4879
4894
_helper.toValue (receiver), name, arguments, fileOffset,
4880
4895
isNullAware: isNullAware);
@@ -4917,6 +4932,7 @@ class PropertySelector extends Selector {
4917
4932
if (receiver is Generator ) {
4918
4933
return receiver.buildSelectorAccess (this , operatorOffset, isNullAware);
4919
4934
}
4935
+ reportNewAsSelector ();
4920
4936
return PropertyAccessGenerator .make (
4921
4937
_helper, token, _helper.toValue (receiver), name, isNullAware);
4922
4938
}
0 commit comments