mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 09:58:32 +00:00
Add visitor support for record type AST nodes
Change-Id: I81f158eac128cdabe7848d1111f67e41777a7f45 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255803 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Samuel Rawlins <srawlins@google.com>
This commit is contained in:
parent
c020a09a68
commit
325e401bd2
|
@ -553,6 +553,15 @@ abstract class AstVisitor<R> {
|
|||
|
||||
R? visitRecordLiteral(RecordLiteral node);
|
||||
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node);
|
||||
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node);
|
||||
|
||||
R? visitRecordTypeAnnotationNamedFields(RecordTypeAnnotationNamedFields node);
|
||||
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node);
|
||||
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node);
|
||||
|
||||
|
|
|
@ -520,6 +520,27 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
|
|||
@override
|
||||
R? visitRecordLiteral(RecordLiteral node) => visitLiteral(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node) =>
|
||||
visitTypeAnnotation(node);
|
||||
|
||||
R? visitRecordTypeAnnotationField(RecordTypeAnnotationField node) =>
|
||||
visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) =>
|
||||
visitRecordTypeAnnotationField(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) =>
|
||||
visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) =>
|
||||
visitRecordTypeAnnotationField(node);
|
||||
|
||||
@override
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) =>
|
||||
|
@ -1271,6 +1292,32 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
|
|||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
node.visitChildren(this);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) {
|
||||
node.visitChildren(this);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
node.visitChildren(this);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
node.visitChildren(this);
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) {
|
||||
|
@ -1795,6 +1842,23 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
|
|||
@override
|
||||
R? visitRecordLiteral(RecordLiteral node) => null;
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node) => null;
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) =>
|
||||
null;
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) =>
|
||||
null;
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) =>
|
||||
null;
|
||||
|
||||
@override
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) =>
|
||||
|
@ -2226,6 +2290,23 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
|
|||
@override
|
||||
R? visitRecordLiteral(RecordLiteral node) => _throw(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node) => _throw(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) =>
|
||||
_throw(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) =>
|
||||
_throw(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) =>
|
||||
_throw(node);
|
||||
|
||||
@override
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) =>
|
||||
|
@ -3161,6 +3242,40 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
|
|||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
T? visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
stopwatch.start();
|
||||
T? result = _baseVisitor.visitRecordTypeAnnotation(node);
|
||||
stopwatch.stop();
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
T? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) {
|
||||
stopwatch.start();
|
||||
T? result = _baseVisitor.visitRecordTypeAnnotationNamedField(node);
|
||||
stopwatch.stop();
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
T? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
stopwatch.start();
|
||||
T? result = _baseVisitor.visitRecordTypeAnnotationNamedFields(node);
|
||||
stopwatch.stop();
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
T? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
stopwatch.start();
|
||||
T? result = _baseVisitor.visitRecordTypeAnnotationPositionalField(node);
|
||||
stopwatch.stop();
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
T? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) {
|
||||
|
@ -3776,6 +3891,23 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
|
|||
@override
|
||||
R? visitRecordLiteral(RecordLiteral node) => visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotation(RecordTypeAnnotation node) => visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedField(RecordTypeAnnotationNamedField node) =>
|
||||
visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) =>
|
||||
visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) =>
|
||||
visitNode(node);
|
||||
|
||||
@override
|
||||
R? visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) =>
|
||||
|
|
|
@ -9764,8 +9764,7 @@ class RecordTypeAnnotationImpl extends TypeAnnotationImpl
|
|||
|
||||
@override
|
||||
E? accept<E>(AstVisitor<E> visitor) {
|
||||
// TODO: implement accept
|
||||
throw UnimplementedError();
|
||||
return visitor.visitRecordTypeAnnotation(this);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -9789,8 +9788,7 @@ class RecordTypeAnnotationNamedFieldImpl extends RecordTypeAnnotationFieldImpl
|
|||
|
||||
@override
|
||||
E? accept<E>(AstVisitor<E> visitor) {
|
||||
// TODO: implement accept
|
||||
throw UnimplementedError();
|
||||
return visitor.visitRecordTypeAnnotationNamedField(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9827,8 +9825,7 @@ class RecordTypeAnnotationNamedFieldsImpl extends AstNodeImpl
|
|||
|
||||
@override
|
||||
E? accept<E>(AstVisitor<E> visitor) {
|
||||
// TODO: implement accept
|
||||
throw UnimplementedError();
|
||||
return visitor.visitRecordTypeAnnotationNamedFields(this);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -9852,8 +9849,7 @@ class RecordTypeAnnotationPositionalFieldImpl
|
|||
|
||||
@override
|
||||
E? accept<E>(AstVisitor<E> visitor) {
|
||||
// TODO: implement accept
|
||||
throw UnimplementedError();
|
||||
return visitor.visitRecordTypeAnnotationPositionalField(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -901,6 +901,48 @@ class ToSourceVisitor implements AstVisitor<void> {
|
|||
_visitToken(node.rightParenthesis);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
var positionalFields = node.positionalFields;
|
||||
var namedFields = node.namedFields;
|
||||
|
||||
sink.write('(');
|
||||
if (positionalFields.isNotEmpty) {
|
||||
_visitNodeList(positionalFields, separator: ', ');
|
||||
if (namedFields != null) {
|
||||
sink.write(', ');
|
||||
}
|
||||
}
|
||||
_visitNode(namedFields);
|
||||
sink.write(')');
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationNamedField(
|
||||
RecordTypeAnnotationNamedField node) {
|
||||
_visitNode(node.type);
|
||||
sink.write(' ');
|
||||
sink.write(node.name);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
sink.write('{');
|
||||
_visitNodeList(node.fields, separator: ', ');
|
||||
sink.write('}');
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
_visitNode(node.type);
|
||||
if (node.name != null) {
|
||||
sink.write(' ');
|
||||
sink.write(node.name);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) {
|
||||
|
|
|
@ -1037,6 +1037,43 @@ class AstComparator implements AstVisitor<bool> {
|
|||
isEqualTokens(node.rightParenthesis, other.rightParenthesis);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
var other = _other as RecordTypeAnnotation;
|
||||
return _isEqualNodeLists(node.positionalFields, other.positionalFields) &&
|
||||
isEqualNodes(node.namedFields, other.namedFields) &&
|
||||
isEqualTokens(node.question, other.question);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationNamedField(
|
||||
RecordTypeAnnotationNamedField node) {
|
||||
var other = _other as RecordTypeAnnotationNamedField;
|
||||
return isEqualTokens(node.comma, other.comma) &&
|
||||
_isEqualNodeLists(node.metadata, other.metadata) &&
|
||||
isEqualTokens(node.name, other.name) &&
|
||||
isEqualNodes(node.type, other.type);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
var other = _other as RecordTypeAnnotationNamedFields;
|
||||
return isEqualTokens(node.leftBracket, other.leftBracket) &&
|
||||
_isEqualNodeLists(node.fields, other.fields) &&
|
||||
isEqualTokens(node.rightBracket, other.rightBracket);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
var other = _other as RecordTypeAnnotationPositionalField;
|
||||
return isEqualTokens(node.comma, other.comma) &&
|
||||
_isEqualNodeLists(node.metadata, other.metadata) &&
|
||||
isEqualTokens(node.name, other.name) &&
|
||||
isEqualNodes(node.type, other.type);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) {
|
||||
|
@ -2768,6 +2805,50 @@ class NodeReplacer implements AstVisitor<bool> {
|
|||
return visitNode(node);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
if (_replaceInList(node.positionalFields)) {
|
||||
return true;
|
||||
} else if (identical(node.namedFields, _oldNode)) {
|
||||
// node.namedFields = _newNode as RecordTypeAnnotationNamedFields;
|
||||
throw UnimplementedError();
|
||||
}
|
||||
return visitNode(node);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationNamedField(
|
||||
RecordTypeAnnotationNamedField node) {
|
||||
if (_replaceInList(node.metadata)) {
|
||||
return true;
|
||||
} else if (identical(node.type, _oldNode)) {
|
||||
// node.type = _newNode as TypeAnnotation;
|
||||
throw UnimplementedError();
|
||||
}
|
||||
return visitNode(node);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
if (_replaceInList(node.fields)) {
|
||||
return true;
|
||||
}
|
||||
return visitNode(node);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
if (_replaceInList(node.metadata)) {
|
||||
return true;
|
||||
} else if (identical(node.type, _oldNode)) {
|
||||
// node.type = _newNode as TypeAnnotation;
|
||||
throw UnimplementedError();
|
||||
}
|
||||
return visitNode(node);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitRedirectingConstructorInvocation(
|
||||
covariant RedirectingConstructorInvocationImpl node) {
|
||||
|
|
|
@ -988,6 +988,42 @@ class AstTestFactory {
|
|||
);
|
||||
}
|
||||
|
||||
static RecordTypeAnnotation recordTypeAnnotation(
|
||||
{required List<RecordTypeAnnotationPositionalField> positionalFields,
|
||||
required List<RecordTypeAnnotationNamedField> namedFields,
|
||||
bool isNullable = false}) {
|
||||
return RecordTypeAnnotationImpl(
|
||||
positionalFields: positionalFields,
|
||||
namedFields: namedFields.isEmpty
|
||||
? null
|
||||
: RecordTypeAnnotationNamedFieldsImpl(
|
||||
leftBracket:
|
||||
TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
|
||||
fields: namedFields,
|
||||
rightBracket:
|
||||
TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET)),
|
||||
question:
|
||||
isNullable ? TokenFactory.tokenFromType(TokenType.QUESTION) : null);
|
||||
}
|
||||
|
||||
static RecordTypeAnnotationNamedField recordTypeAnnotationNamedField(
|
||||
TypeAnnotationImpl type, String name) {
|
||||
return RecordTypeAnnotationNamedFieldImpl(
|
||||
comma: TokenFactory.tokenFromType(TokenType.COMMA),
|
||||
metadata: null,
|
||||
name: TokenFactory.tokenFromString(name),
|
||||
type: type);
|
||||
}
|
||||
|
||||
static RecordTypeAnnotationPositionalField
|
||||
recordTypeAnnotationPositionalField(TypeAnnotationImpl type) {
|
||||
return RecordTypeAnnotationPositionalFieldImpl(
|
||||
comma: TokenFactory.tokenFromType(TokenType.COMMA),
|
||||
metadata: null,
|
||||
name: null,
|
||||
type: type);
|
||||
}
|
||||
|
||||
static RedirectingConstructorInvocationImpl redirectingConstructorInvocation(
|
||||
[List<Expression> arguments = const []]) =>
|
||||
redirectingConstructorInvocation2(null, arguments);
|
||||
|
|
|
@ -629,6 +629,33 @@ class LinterVisitor implements AstVisitor<void> {
|
|||
node.visitChildren(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotation(RecordTypeAnnotation node) {
|
||||
_runSubscriptions(node, registry._forRecordTypeAnnotation);
|
||||
node.visitChildren(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationNamedField(
|
||||
RecordTypeAnnotationNamedField node) {
|
||||
_runSubscriptions(node, registry._forRecordTypeAnnotationNamedField);
|
||||
node.visitChildren(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationNamedFields(
|
||||
RecordTypeAnnotationNamedFields node) {
|
||||
_runSubscriptions(node, registry._forRecordTypeAnnotationNamedFields);
|
||||
node.visitChildren(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRecordTypeAnnotationPositionalField(
|
||||
RecordTypeAnnotationPositionalField node) {
|
||||
_runSubscriptions(node, registry._forRecordTypeAnnotationPositionalField);
|
||||
node.visitChildren(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitRedirectingConstructorInvocation(
|
||||
RedirectingConstructorInvocation node) {
|
||||
|
@ -977,6 +1004,13 @@ class NodeLintRegistry {
|
|||
final List<_Subscription<PrefixExpression>> _forPrefixExpression = [];
|
||||
final List<_Subscription<PropertyAccess>> _forPropertyAccess = [];
|
||||
final List<_Subscription<RecordLiteral>> _forRecordLiterals = [];
|
||||
final List<_Subscription<RecordTypeAnnotation>> _forRecordTypeAnnotation = [];
|
||||
final List<_Subscription<RecordTypeAnnotationNamedField>>
|
||||
_forRecordTypeAnnotationNamedField = [];
|
||||
final List<_Subscription<RecordTypeAnnotationNamedFields>>
|
||||
_forRecordTypeAnnotationNamedFields = [];
|
||||
final List<_Subscription<RecordTypeAnnotationPositionalField>>
|
||||
_forRecordTypeAnnotationPositionalField = [];
|
||||
final List<_Subscription<RedirectingConstructorInvocation>>
|
||||
_forRedirectingConstructorInvocation = [];
|
||||
final List<_Subscription<RethrowExpression>> _forRethrowExpression = [];
|
||||
|
|
|
@ -2804,6 +2804,44 @@ var v = !(a == b);
|
|||
]));
|
||||
}
|
||||
|
||||
void test_visitRecordTypeAnnotation_mixed() {
|
||||
_assertSource(
|
||||
"(int, bool, {int a, bool b})",
|
||||
AstTestFactory.recordTypeAnnotation(positionalFields: [
|
||||
AstTestFactory.recordTypeAnnotationPositionalField(
|
||||
AstTestFactory.namedType4('int')),
|
||||
AstTestFactory.recordTypeAnnotationPositionalField(
|
||||
AstTestFactory.namedType4('bool')),
|
||||
], namedFields: [
|
||||
AstTestFactory.recordTypeAnnotationNamedField(
|
||||
AstTestFactory.namedType4('int'), 'a'),
|
||||
AstTestFactory.recordTypeAnnotationNamedField(
|
||||
AstTestFactory.namedType4('bool'), 'b'),
|
||||
]));
|
||||
}
|
||||
|
||||
void test_visitRecordTypeAnnotation_named() {
|
||||
_assertSource(
|
||||
"({int a, bool b})",
|
||||
AstTestFactory.recordTypeAnnotation(positionalFields: [], namedFields: [
|
||||
AstTestFactory.recordTypeAnnotationNamedField(
|
||||
AstTestFactory.namedType4('int'), 'a'),
|
||||
AstTestFactory.recordTypeAnnotationNamedField(
|
||||
AstTestFactory.namedType4('bool'), 'b'),
|
||||
]));
|
||||
}
|
||||
|
||||
void test_visitRecordTypeAnnotation_positional() {
|
||||
_assertSource(
|
||||
"(int, bool)",
|
||||
AstTestFactory.recordTypeAnnotation(positionalFields: [
|
||||
AstTestFactory.recordTypeAnnotationPositionalField(
|
||||
AstTestFactory.namedType4('int')),
|
||||
AstTestFactory.recordTypeAnnotationPositionalField(
|
||||
AstTestFactory.namedType4('bool')),
|
||||
], namedFields: []));
|
||||
}
|
||||
|
||||
void test_visitRedirectingConstructorInvocation_named() {
|
||||
_assertSource(
|
||||
"this.c()", AstTestFactory.redirectingConstructorInvocation2("c"));
|
||||
|
|
Loading…
Reference in a new issue