mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:09:49 +00:00
[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:
parent
c0a9d571ce
commit
2a5c85e7cf
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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!;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue