Version 2.15.0-55.0.dev
Merge commit '965af148f3db6d7a119dd329d8ed066571a608e5' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
index d42c6ed..d83d3a0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
@@ -17,7 +17,10 @@
class ClassMemberParser extends Parser {
Parser? skipParser;
- ClassMemberParser(Listener listener) : super(listener);
+ ClassMemberParser(Listener listener,
+ {bool useImplicitCreationExpression: true})
+ : super(listener,
+ useImplicitCreationExpression: useImplicitCreationExpression);
@override
Token parseExpression(Token token) {
@@ -35,7 +38,8 @@
// not triggered during the second parse.
// When the parser supports not doing token stream rewriting, use that
// feature together with a no-op listener instead.
- this.skipParser ??= new Parser(new ErrorDelegationListener(listener));
+ this.skipParser ??= new Parser(new ErrorDelegationListener(listener),
+ useImplicitCreationExpression: useImplicitCreationExpression);
Parser skipParser = this.skipParser!;
skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
skipParser.asyncState = asyncState;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
index 0bd8882..0239fca 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser.dart
@@ -53,9 +53,11 @@
}
}
-List<ParserError> parse(Token tokens) {
+List<ParserError> parse(Token tokens,
+ {bool useImplicitCreationExpression: true}) {
ErrorCollectingListener listener = new ErrorCollectingListener();
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpression);
parser.parseUnit(tokens);
return listener.recoverableErrors;
}
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index aa035a0..26c8242 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -300,7 +300,22 @@
return cachedRewriter ??= new TokenStreamRewriterImpl();
}
- Parser(this.listener)
+ /// If `true`, syntax like `foo<bar>.baz()` is parsed like an implicit
+ /// creation expression. Otherwise it is parsed as a explicit instantiation
+ /// followed by an invocation.
+ ///
+ /// With the constructor-tearoffs experiment, such syntax can lead to a valid
+ /// expression that is _not_ an implicit creation expression, and the parser
+ /// should therefore not special case the syntax but instead let listeners
+ /// resolve the expression by the seen selectors.
+ ///
+ /// Use this flag to test that the implementation doesn't need the special
+ /// casing.
+ // TODO(johnniwinther): Remove this when both analyzer and CFE can parse the
+ // implicit create expression without the special casing.
+ final bool useImplicitCreationExpression;
+
+ Parser(this.listener, {this.useImplicitCreationExpression: true})
: assert(listener != null); // ignore:unnecessary_null_comparison
bool get inGenerator {
@@ -5260,7 +5275,7 @@
token.next!, POSTFIX_PRECEDENCE, allowCascades);
listener.handleUnaryPrefixAssignmentExpression(operator);
return token;
- } else if (token.next!.isIdentifier) {
+ } else if (useImplicitCreationExpression && token.next!.isIdentifier) {
Token identifier = token.next!;
if (optional(".", identifier.next!)) {
identifier = identifier.next!.next!;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
index 93be64c..5399b86 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
@@ -15,7 +15,9 @@
/// Parser which only parses top-level elements, but ignores their bodies.
/// Use [Parser] to parse everything.
class TopLevelParser extends ClassMemberParser {
- TopLevelParser(Listener listener) : super(listener);
+ TopLevelParser(Listener listener, {bool useImplicitCreationExpression: true})
+ : super(listener,
+ useImplicitCreationExpression: useImplicitCreationExpression);
@override
Token parseClassOrMixinOrExtensionBody(Token token, DeclarationKind kind,
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 0e3c1e3..6a29b7d 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -7542,8 +7542,10 @@
// }
// ```
static const CompileTimeErrorCode LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR =
- CompileTimeErrorCode('LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR',
- "Can't have a late final field in a class with a const constructor.",
+ CompileTimeErrorCode(
+ 'LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR',
+ "Can't have a late final field in a class with a generative "
+ "const constructor.",
correction: "Try removing the 'late' modifier, or don't declare "
"'const' constructors.",
hasPublishedDocs: true);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 80e0fb6..7f5d9e6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2817,8 +2817,10 @@
// The field is in an extension and should be handled elsewhere.
return;
}
- var hasConstConstructor = enclosingClass.constructors.any((c) => c.isConst);
- if (!hasConstConstructor) return;
+
+ var hasGenerativeConstConstructor =
+ _enclosingClass!.constructors.any((c) => c.isConst && !c.isFactory);
+ if (!hasGenerativeConstConstructor) return;
errorReporter.reportErrorForToken(
CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 7f49c50..6287bc4 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -245,17 +245,16 @@
void visitFieldFormalParameter(FieldFormalParameter node) {
_writeByte(Tag.FieldFormalParameter);
- _pushScopeTypeParameters(node.typeParameters);
- _writeOptionalNode(node.typeParameters);
- _writeOptionalNode(node.type);
- _writeOptionalNode(node.parameters);
- _storeNormalFormalParameter(
- node,
- node.keyword,
- hasQuestion: node.question != null,
- );
-
- _sink.localElements.popScope();
+ _withTypeParameters(node.typeParameters, () {
+ _writeOptionalNode(node.typeParameters);
+ _writeOptionalNode(node.type);
+ _writeOptionalNode(node.parameters);
+ _storeNormalFormalParameter(
+ node,
+ node.keyword,
+ hasQuestion: node.question != null,
+ );
+ });
}
@override
@@ -325,13 +324,12 @@
void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
_writeByte(Tag.FunctionTypedFormalParameter);
- _pushScopeTypeParameters(node.typeParameters);
- _writeOptionalNode(node.typeParameters);
- _writeOptionalNode(node.returnType);
- _writeNode(node.parameters);
- _storeNormalFormalParameter(node, null);
-
- _sink.localElements.popScope();
+ _withTypeParameters(node.typeParameters, () {
+ _writeOptionalNode(node.typeParameters);
+ _writeOptionalNode(node.returnType);
+ _writeNode(node.parameters);
+ _storeNormalFormalParameter(node, null);
+ });
}
@override
@@ -344,14 +342,12 @@
),
);
- _pushScopeTypeParameters(node.typeParameters);
-
- _writeOptionalNode(node.typeParameters);
- _writeOptionalNode(node.returnType);
- _writeNode(node.parameters);
-
- _sink.writeType(node.type);
- _sink.localElements.popScope();
+ _withTypeParameters(node.typeParameters, () {
+ _writeOptionalNode(node.typeParameters);
+ _writeOptionalNode(node.returnType);
+ _writeNode(node.parameters);
+ _sink.writeType(node.type);
+ });
}
@override
@@ -776,18 +772,6 @@
_storeAnnotatedNode(node);
}
- void _pushScopeTypeParameters(TypeParameterList? node) {
- _sink.localElements.pushScope();
-
- if (node == null) {
- return;
- }
-
- for (var typeParameter in node.typeParameters) {
- _sink.localElements.declare(typeParameter.declaredElement!);
- }
- }
-
void _storeAnnotatedNode(AnnotatedNode node) {
_writeNodeList(node.metadata);
}
@@ -850,6 +834,19 @@
_storeFormalParameter(node);
}
+ void _withTypeParameters(TypeParameterList? node, void Function() f) {
+ if (node == null) {
+ f();
+ } else {
+ var elements = node.typeParameters
+ .map((typeParameter) => typeParameter.declaredElement!)
+ .toList();
+ _sink.localElements.withElements(elements, () {
+ f();
+ });
+ }
+ }
+
void _writeActualType(ResolutionSink resolutionSink, DartType type) {
resolutionSink.writeType(type);
}
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 8a3993f..6c96d5e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -160,16 +160,12 @@
ConstructorElementFlags.write(_sink, element);
_resolutionSink._writeAnnotationList(element.metadata);
- _resolutionSink.localElements.pushScope();
- _resolutionSink.localElements.declareAll(element.parameters);
- try {
+ _resolutionSink.localElements.withElements(element.parameters, () {
_writeList(element.parameters, _writeParameterElement);
_writeMacro(element.macro);
_resolutionSink.writeElement(element.redirectedConstructor);
_resolutionSink._writeNodeList(element.constantInitializers);
- } finally {
- _resolutionSink.localElements.popScope();
- }
+ });
}
void _writeEnumElement(ClassElement element) {
@@ -430,14 +426,10 @@
List<TypeParameterElement> typeParameters,
void Function() f,
) {
- _resolutionSink.localElements.pushScope();
- _resolutionSink.localElements.declareAll(typeParameters);
- try {
+ _resolutionSink.localElements.withElements(typeParameters, () {
_sink.writeList(typeParameters, _writeTypeParameterElement);
f();
- } finally {
- _resolutionSink.localElements.popScope();
- }
+ });
}
void _writeUnitElement(CompilationUnitElement unitElement) {
@@ -745,9 +737,7 @@
void Function() f, {
required bool withAnnotations,
}) {
- localElements.pushScope();
- localElements.declareAll(typeParameters);
- try {
+ localElements.withElements(typeParameters, () {
writeUInt30(typeParameters.length);
for (var typeParameter in typeParameters) {
_writeStringReference(typeParameter.name);
@@ -759,9 +749,7 @@
}
}
f();
- } finally {
- localElements.popScope();
- }
+ });
}
static List<DartType> _enclosingClassTypeArguments(
@@ -942,7 +930,6 @@
class _LocalElementIndexer {
final Map<Element, int> _index = Map.identity();
- final List<int> _scopes = [];
int _stackHeight = 0;
int operator [](Element element) {
@@ -950,22 +937,17 @@
(throw ArgumentError('Unexpectedly not indexed: $element'));
}
- void declare(Element element) {
- _index[element] = _stackHeight++;
- }
-
- void declareAll(List<Element> elements) {
+ void withElements(List<Element> elements, void Function() f) {
for (var element in elements) {
- declare(element);
+ _index[element] = _stackHeight++;
}
- }
- void popScope() {
- _stackHeight = _scopes.removeLast();
- }
+ f();
- void pushScope() {
- _scopes.add(_stackHeight);
+ _stackHeight -= elements.length;
+ for (var element in elements) {
+ _index.remove(element);
+ }
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
index 17cf219..688771e 100644
--- a/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/late_final_field_with_const_constructor_test.dart
@@ -62,6 +62,22 @@
''');
}
+ test_class_hasConstFactoryConstructor() async {
+ await assertNoErrorsInCode('''
+class Base {
+ Base();
+ const factory Base.empty() = _Empty;
+ late final int property;
+}
+
+class _Empty implements Base {
+ const _Empty();
+ int get property => 0;
+ set property(_) {}
+}
+''');
+ }
+
test_class_noConstConstructor() async {
await assertNoErrorsInCode('''
class A {
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index d900b81..a6571b2 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -7438,7 +7438,7 @@
### late_final_field_with_const_constructor
-_Can't have a late final field in a class with a const constructor._
+_Can't have a late final field in a class with a generative const constructor._
#### Description
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 5a8daa1..71bb73f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -99,6 +99,8 @@
import '../scope.dart';
+import '../source/diet_parser.dart';
+
import '../source/scope_listener.dart'
show
FixedNullableList,
@@ -1496,7 +1498,8 @@
}
void parseInitializers(Token token) {
- Parser parser = new Parser(this);
+ Parser parser = new Parser(this,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (!token.isEof) {
token = parser.parseInitializers(token);
checkEmpty(token.charOffset);
@@ -1509,7 +1512,8 @@
}
Expression parseFieldInitializer(Token token) {
- Parser parser = new Parser(this);
+ Parser parser = new Parser(this,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
token = parser.parseExpression(parser.syntheticPreviousToken(token));
Expression expression = popForValue();
checkEmpty(token.charOffset);
@@ -1517,7 +1521,8 @@
}
Expression parseAnnotation(Token token) {
- Parser parser = new Parser(this);
+ Parser parser = new Parser(this,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
token = parser.parseMetadata(parser.syntheticPreviousToken(token));
Expression annotation = pop() as Expression;
checkEmpty(token.charOffset);
@@ -6454,8 +6459,12 @@
allowPotentiallyConstantType: allowPotentiallyConstantType);
if (message == null) return unresolved;
return new UnresolvedType(
- new NamedTypeBuilder(typeParameter.name!, builder.nullabilityBuilder,
- /* arguments = */ null, unresolved.fileUri, unresolved.charOffset)
+ new NamedTypeBuilder(
+ typeParameter.name!,
+ builder.nullabilityBuilder,
+ /* arguments = */ null,
+ unresolved.fileUri,
+ unresolved.charOffset)
..bind(new InvalidTypeDeclarationBuilder(
typeParameter.name!, message)),
unresolved.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 331d16b..01268b4 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -64,6 +64,8 @@
import '../type_inference/type_inferrer.dart' show TypeInferrer;
+import 'diet_parser.dart';
+
import 'source_library_builder.dart' show SourceLibraryBuilder;
import 'stack_listener_impl.dart';
@@ -792,7 +794,8 @@
MemberKind kind, Token? metadata) {
final StackListenerImpl listener = createFunctionListener(builder);
try {
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
listener.pop(); // Pops metadata constants.
@@ -971,7 +974,8 @@
Token? metadata, MemberKind kind) {
Token token = startToken;
try {
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
listener.pop(); // Annotations.
@@ -1005,7 +1009,8 @@
void parseFields(StackListenerImpl listener, Token startToken,
Token? metadata, bool isTopLevel) {
Token token = startToken;
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (isTopLevel) {
token = parser.parseTopLevelMember(metadata ?? token);
} else {
@@ -1122,7 +1127,8 @@
if (metadata != null) {
StackListenerImpl listener = createListener(builder, memberScope,
isDeclarationInstanceMember: false);
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
return listener.finishMetadata(parent);
}
diff --git a/pkg/front_end/lib/src/fasta/source/diet_parser.dart b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
index 6bed46d..15b4333 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_parser.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
@@ -9,9 +9,13 @@
import 'package:_fe_analyzer_shared/src/parser/parser.dart'
show ClassMemberParser, Listener, MemberKind;
+const bool useImplicitCreationExpressionInCfe = true;
+
// TODO(ahe): Move this to parser package.
class DietParser extends ClassMemberParser {
- DietParser(Listener listener) : super(listener);
+ DietParser(Listener listener)
+ : super(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
Token parseFormalParametersRest(Token token, MemberKind kind) {
return skipFormalParametersRest(token, kind);
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index c132517..585b690 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -114,7 +114,7 @@
import '../util/helpers.dart';
import 'diet_listener.dart' show DietListener;
-import 'diet_parser.dart' show DietParser;
+import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
import 'outline_builder.dart' show OutlineBuilder;
import 'source_class_builder.dart' show SourceClassBuilder;
import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -559,7 +559,10 @@
isDeclarationInstanceMember: isClassInstanceMember) as BodyBuilder;
return listener.parseSingleExpression(
- new Parser(listener), token, parameters);
+ new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe),
+ token,
+ parameters);
}
KernelTarget get target => super.target as KernelTarget;
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
index d32f428..d238f71 100644
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
@@ -17,7 +17,9 @@
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import '../source/diet_parser.dart';
+
+import 'direct_parser_ast_helper.dart';
DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
{bool includeBody: true,
@@ -51,9 +53,11 @@
DirectParserASTListener listener = new DirectParserASTListener();
Parser parser;
if (includeBody) {
- parser = new Parser(listener);
+ parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
} else {
- parser = new ClassMemberParser(listener);
+ parser = new ClassMemberParser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
}
parser.parseUnit(firstToken);
return listener.data.single as DirectParserASTContentCompilationUnitEnd;
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index a9cb6ad..9c94019 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -47,6 +47,8 @@
import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
import 'package:front_end/src/fasta/messages.dart' show Message;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
@@ -1984,7 +1986,8 @@
}
ParserTestListener parserTestListener = new ParserTestListener(false);
- Parser parser = new Parser(parserTestListener);
+ Parser parser = new Parser(parserTestListener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(firstToken);
String parsedString =
parser_suite.tokenStreamToString(firstToken, lineStarts).toString();
@@ -2000,7 +2003,8 @@
}
ParserErrorListener parserErrorListener = new ParserErrorListener();
- Parser parser = new Parser(parserErrorListener);
+ Parser parser = new Parser(parserErrorListener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(firstToken);
return !parserErrorListener.gotError;
}
diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
index 3dd5da0..318f02e81 100644
--- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
@@ -8,6 +8,7 @@
import 'package:_fe_analyzer_shared/src/parser/async_modifier.dart';
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
import 'package:front_end/src/fasta/messages.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -542,7 +543,8 @@
{bool inAsync, List<ExpectedError> errors, String expectAfter}) {
final start = scanString(source).tokens;
final listener = new TestInfoListener();
- final parser = new Parser(listener);
+ final parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (inAsync != null) parser.asyncState = AsyncModifier.Async;
final lastConsumed = parser.parseLiteralListSuffix(start, null);
@@ -839,7 +841,8 @@
{bool inAsync, List<ExpectedError> errors, String expectAfter}) {
final start = scanString(source).tokens;
final listener = new TestInfoListener();
- final parser = new Parser(listener);
+ final parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (inAsync != null) parser.asyncState = AsyncModifier.Async;
final lastConsumed = parser.parseMapLiteralEntry(start);
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index 9c9f13a..76bcbd0 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -6,6 +6,7 @@
import 'package:_fe_analyzer_shared/src/parser/parser.dart'
show ParserError, parse;
+import 'package:front_end/src/fasta/source/diet_parser.dart';
import 'package:testing/testing.dart'
show Chain, ChainContext, Result, Step, runMe;
@@ -32,7 +33,8 @@
Future<Result<Null>> run(ScannedFile file, ChainContext context) async {
try {
- List<ParserError> errors = parse(file.result.tokens);
+ List<ParserError> errors = parse(file.result.tokens,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
if (errors.isNotEmpty) {
return fail(null, errors.join("\n"));
}
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index ce747ba..0894483 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -11,6 +11,7 @@
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as scanner;
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:front_end/src/fasta/messages.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -111,7 +112,12 @@
final Token start = scanString('before ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noType.ensureTypeNotVoid(start, new Parser(listener)),
+ expect(
+ noType.ensureTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
const TypeMatcher<SyntheticStringToken>());
expect(listener.calls, [
'handleIdentifier typeReference',
@@ -125,7 +131,12 @@
final Token start = scanString('before ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noType.ensureTypeOrVoid(start, new Parser(listener)),
+ expect(
+ noType.ensureTypeOrVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
const TypeMatcher<SyntheticStringToken>());
expect(listener.calls, [
'handleIdentifier typeReference',
@@ -139,7 +150,13 @@
final Token start = scanString('before ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noType.parseType(start, new Parser(listener)), start);
+ expect(
+ noType.parseType(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start);
expect(listener.calls, ['handleNoType before']);
expect(listener.errors, isNull);
}
@@ -148,7 +165,13 @@
final Token start = scanString('before ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noType.parseTypeNotVoid(start, new Parser(listener)), start);
+ expect(
+ noType.parseTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start);
expect(listener.calls, ['handleNoType before']);
expect(listener.errors, isNull);
}
@@ -190,7 +213,13 @@
final Token start = scanString('before void ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(voidType.ensureTypeNotVoid(start, new Parser(listener)), start.next);
+ expect(
+ voidType.ensureTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start.next);
expect(listener.calls, [
'handleIdentifier void typeReference',
'handleNoTypeArguments ;',
@@ -203,7 +232,13 @@
final Token start = scanString('before void ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(voidType.parseType(start, new Parser(listener)), start.next);
+ expect(
+ voidType.parseType(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start.next);
expect(listener.calls, ['handleVoidKeyword void']);
expect(listener.errors, isNull);
}
@@ -212,7 +247,13 @@
final Token start = scanString('before void ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(voidType.parseType(start, new Parser(listener)), start.next);
+ expect(
+ voidType.parseType(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start.next);
expect(listener.calls, ['handleVoidKeyword void']);
expect(listener.errors, isNull);
}
@@ -221,7 +262,13 @@
final Token start = scanString('before void ;').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(voidType.parseTypeNotVoid(start, new Parser(listener)), start.next);
+ expect(
+ voidType.parseTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start.next);
expect(listener.calls, [
'handleIdentifier void typeReference',
'handleNoTypeArguments ;',
@@ -270,16 +317,32 @@
}
listener = new TypeInfoListener();
- assertResult(prefixedType.ensureTypeNotVoid(start, new Parser(listener)));
+ assertResult(prefixedType.ensureTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)));
listener = new TypeInfoListener();
- assertResult(prefixedType.ensureTypeOrVoid(start, new Parser(listener)));
+ assertResult(prefixedType.ensureTypeOrVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)));
listener = new TypeInfoListener();
- assertResult(prefixedType.parseTypeNotVoid(start, new Parser(listener)));
+ assertResult(prefixedType.parseTypeNotVoid(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)));
listener = new TypeInfoListener();
- assertResult(prefixedType.parseType(start, new Parser(listener)));
+ assertResult(prefixedType.parseType(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)));
}
}
@@ -1492,7 +1555,13 @@
final Token start = scanString('before after').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noTypeParamOrArg.parseArguments(start, new Parser(listener)), start);
+ expect(
+ noTypeParamOrArg.parseArguments(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start);
validateTokens(start);
expect(listener.calls, ['handleNoTypeArguments after']);
expect(listener.errors, isNull);
@@ -1502,7 +1571,13 @@
final Token start = scanString('before after').tokens;
final TypeInfoListener listener = new TypeInfoListener();
- expect(noTypeParamOrArg.parseVariables(start, new Parser(listener)), start);
+ expect(
+ noTypeParamOrArg.parseVariables(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression:
+ useImplicitCreationExpressionInCfe)),
+ start);
validateTokens(start);
expect(listener.calls, ['handleNoTypeVariables after']);
expect(listener.errors, isNull);
@@ -1585,7 +1660,10 @@
expect(after.lexeme, 'after');
final TypeInfoListener listener = new TypeInfoListener();
- var token = typeArg.parseArguments(start, new Parser(listener));
+ var token = typeArg.parseArguments(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
validateTokens(start);
expect(token.lexeme, '>');
token = token.next;
@@ -1623,7 +1701,10 @@
expect(after.lexeme, 'after');
final TypeInfoListener listener = new TypeInfoListener();
- Token token = typeParam.parseVariables(start, new Parser(listener));
+ Token token = typeParam.parseVariables(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
validateTokens(start);
expect(token.lexeme, '>');
token = token.next;
@@ -2576,7 +2657,10 @@
reason: 'TypeInfo.skipType should not modify the token stream');
TypeInfoListener listener = new TypeInfoListener();
- Token actualEnd = typeInfo.parseType(start, new Parser(listener));
+ Token actualEnd = typeInfo.parseType(
+ start,
+ new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
expectEnd(expectedAfter, actualEnd);
if (expectedCalls != null) {
@@ -2609,7 +2693,8 @@
expect(typeVarInfo.typeArgumentCount, typeArgumentCount);
TypeInfoListener listener = new TypeInfoListener();
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
Token actualEnd = typeVarInfo.parseArguments(start, parser);
validateTokens(start);
expectEnd(expectedAfter, actualEnd);
@@ -2644,7 +2729,8 @@
TypeInfoListener listener =
new TypeInfoListener(firstToken: start, metadataAllowed: true);
- Parser parser = new Parser(listener);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
Token actualEnd = typeVarInfo.parseVariables(start, parser);
validateTokens(start);
expectEnd(expectedAfter, actualEnd);
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index d5b0da7..dd393f6 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -22,6 +22,8 @@
import 'package:front_end/src/fasta/command_line_reporting.dart'
as command_line_reporting;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
import 'package:kernel/kernel.dart';
@@ -185,7 +187,8 @@
return crash(description, StackTrace.current);
}
- Parser parser = new Parser(description.listener);
+ Parser parser = new Parser(description.listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(description.cache.firstToken);
if (description.listener.problems.isEmpty) {
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 86afab8..1d51206 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -14,6 +14,8 @@
as command_line_reporting;
import 'package:front_end/src/fasta/messages.dart' show Message;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
import 'package:front_end/src/fasta/util/direct_parser_ast.dart' show getAST;
@@ -198,7 +200,8 @@
ParserTestListenerWithMessageFormatting parserTestListener =
new ParserTestListenerWithMessageFormatting(
addTrace, annotateLines, source, shortNameId);
- Parser parser = new Parser(parserTestListener);
+ Parser parser = new Parser(parserTestListener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(firstToken);
return parserTestListener;
}
@@ -298,7 +301,8 @@
ParserTestListener parserTestListener =
new ParserTestListener(context.addTrace);
- Parser parser = new Parser(parserTestListener);
+ Parser parser = new Parser(parserTestListener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
bool parserCrashed = false;
dynamic parserCrashedE;
StackTrace parserCrashedSt;
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 1e84578..79afa41 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -15,6 +15,8 @@
import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
// THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
// Run this command to update it:
@@ -25,7 +27,9 @@
StringBuffer sb = new StringBuffer();
final bool trace;
- TestParser(Listener listener, this.trace) : super(listener);
+ TestParser(Listener listener, this.trace)
+ : super(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
String createTrace() {
List<String> traceLines = StackTrace.current.toString().split("\n");
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 0a69b8b..806d113 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -55,6 +55,8 @@
import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:front_end/src/fasta/fasta_codes.dart' as codes;
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
// THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
// Run this command to update it:
@@ -65,7 +67,9 @@
StringBuffer sb = new StringBuffer();
final bool trace;
- TestParser(Listener listener, this.trace) : super(listener);
+ TestParser(Listener listener, this.trace)
+ : super(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
String createTrace() {
List<String> traceLines = StackTrace.current.toString().split("\n");
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 38e9a55..09978cc 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -49,6 +49,8 @@
// ignore: import_of_legacy_library_into_null_safe
import 'package:front_end/src/fasta/incremental_compiler.dart';
import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart'
+ show useImplicitCreationExpressionInCfe;
// ignore: import_of_legacy_library_into_null_safe
import 'package:front_end/src/fasta/source/source_library_builder.dart';
import 'package:front_end/src/fasta/uri_translator.dart';
@@ -549,7 +551,8 @@
final Token firstToken =
scanRawBytes(utf8.encode(comments.substring(scanOffset)) as Uint8List);
final ErrorListener listener = new ErrorListener();
- final Parser parser = new Parser(listener);
+ final Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.asyncState = AsyncModifier.Async;
final Token pastErrors = parser.skipErrorTokens(firstToken);
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 1c4cb63..47fa253 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -18,6 +18,7 @@
import 'package:front_end/src/api_prototype/front_end.dart';
import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/fasta/source/diet_parser.dart';
import 'package:front_end/src/fasta/source/directive_listener.dart';
import 'package:front_end/src/fasta/uri_translator.dart' show UriTranslator;
@@ -170,7 +171,9 @@
/// import, export, and part directives.
Set<String> extractDirectiveUris(List<int> contents) {
var listener = new DirectiveListenerWithNative();
- new TopLevelParser(listener).parseUnit(tokenize(contents));
+ new TopLevelParser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe)
+ .parseUnit(tokenize(contents));
return new Set<String>()
..addAll(listener.imports.map((directive) => directive.uri!))
..addAll(listener.exports.map((directive) => directive.uri!))
@@ -201,7 +204,8 @@
/// Parse the full body of [source].
parseFull(Uri uri, List<int> source) {
var tokens = tokenize(source);
- Parser parser = new Parser(new _PartialAstBuilder(uri));
+ Parser parser = new Parser(new _PartialAstBuilder(uri),
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(tokens);
}
diff --git a/tools/VERSION b/tools/VERSION
index c29197a..2aaac9b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 54
+PRERELEASE 55
PRERELEASE_PATCH 0
\ No newline at end of file