[parser] Add useImplicitCreationExpression

This flag prepares for the removal of the special case of implicit
creation syntax, `foo<bar>.baz()`, which with constructor-tearoffs
doesn't have to be a creation expression. Since both the analyzer
and the CFE needs to support parsering without special casing
before it can be removed, the flag is added to ensure both
implementations will agree on what the future parser behavior will be.

The CL hard-wires the CFE use of the parser to a single constant value.

Change-Id: I04724f039d2e698f3cf67e8b0b56dfa7e96ed3b4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/211000
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Johnni Winther 2021-08-25 11:44:53 +00:00 committed by commit-bot@chromium.org
parent c0a9d571ce
commit 2a5c85e7cf
19 changed files with 220 additions and 54 deletions

View file

@ -17,7 +17,10 @@ import 'parser_impl.dart' show Parser;
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 @@ class ClassMemberParser extends Parser {
// 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;

View file

@ -53,9 +53,11 @@ class ErrorCollectingListener extends Listener {
}
}
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;
}

View file

@ -300,7 +300,22 @@ class Parser {
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 @@ class Parser {
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!;

View file

@ -15,7 +15,9 @@ import 'listener.dart' show Listener;
/// 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,

View file

@ -99,6 +99,8 @@ import '../problems.dart'
import '../scope.dart';
import '../source/diet_parser.dart';
import '../source/scope_listener.dart'
show
FixedNullableList,
@ -1496,7 +1498,8 @@ class BodyBuilder extends ScopeListener<JumpTarget>
}
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 @@ class BodyBuilder extends ScopeListener<JumpTarget>
}
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 @@ class BodyBuilder extends ScopeListener<JumpTarget>
}
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 @@ class BodyBuilder extends ScopeListener<JumpTarget>
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,

View file

@ -64,6 +64,8 @@ import '../type_inference/type_inference_engine.dart'
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 @@ class DietListener extends StackListenerImpl {
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 @@ class DietListener extends StackListenerImpl {
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 @@ class DietListener extends StackListenerImpl {
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 @@ class DietListener extends StackListenerImpl {
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);
}

View file

@ -9,9 +9,13 @@ import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
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);

View file

@ -114,7 +114,7 @@ import '../type_inference/type_inferrer.dart';
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 @@ class SourceLoader extends Loader {
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;

View file

@ -17,7 +17,9 @@ import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
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 @@ DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
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;

View file

@ -47,6 +47,8 @@ import 'package:front_end/src/fasta/incremental_compiler.dart'
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 @@ worlds:
}
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 @@ worlds:
}
ParserErrorListener parserErrorListener = new ParserErrorListener();
Parser parser = new Parser(parserErrorListener);
Parser parser = new Parser(parserErrorListener,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
parser.parseUnit(firstToken);
return !parserErrorListener.gotError;
}

View file

@ -8,6 +8,7 @@ import 'package:_fe_analyzer_shared/src/parser/parser.dart';
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 @@ class CollectionElementTest {
{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 @@ class MapElementTest {
{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);

View file

@ -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 @@ class Parse extends Step<ScannedFile, Null, ChainContext> {
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"));
}

View file

@ -11,6 +11,7 @@ import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' hide scanString;
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 @@ class NoTypeInfoTest {
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 @@ class NoTypeInfoTest {
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 @@ class NoTypeInfoTest {
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 @@ class NoTypeInfoTest {
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 @@ class VoidTypeInfoTest {
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 @@ class VoidTypeInfoTest {
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 @@ class VoidTypeInfoTest {
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 @@ class VoidTypeInfoTest {
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 @@ class PrefixedTypeInfoTest {
}
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 @@ class NoTypeParamOrArgTest {
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 @@ class NoTypeParamOrArgTest {
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 @@ class SimpleTypeParamOrArgTest {
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 @@ class SimpleTypeParamOrArgTest {
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 @@ ComplexTypeInfo computeComplex(
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 @@ void expectComplexTypeArg(String source,
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 @@ void expectComplexTypeParam(String source,
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);

View file

@ -22,6 +22,8 @@ import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
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 @@ class LintStep extends Step<LintTestDescription, LintTestDescription, Context> {
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) {

View file

@ -14,6 +14,8 @@ import 'package:front_end/src/fasta/command_line_reporting.dart'
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 @@ class ListenerStep extends Step<TestDescription, TestDescription, Context> {
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 @@ class TokenStep extends Step<TestDescription, TestDescription, Context> {
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;

View file

@ -15,6 +15,8 @@ import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
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 @@ class TestParser extends Parser {
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");

View file

@ -55,6 +55,8 @@ import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
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 @@ class TestParser extends Parser {
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");

View file

@ -49,6 +49,8 @@ import 'package:front_end/src/fasta/hybrid_file_system.dart';
// 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 @@ List<Test> extractTestsFromComment(
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);

View file

@ -18,6 +18,7 @@ import 'package:args/args.dart';
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 @@ Future<Null> collectSources(Uri start, Map<Uri, List<int>> files) async {
/// 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 @@ void parseFiles(Map<Uri, List<int>> files) {
/// 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);
}