blob: b96dfe5736574fd3b2c7b05ac6f5f82eb2b393e0 [file] [log] [blame]
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
/// Visitor that collects super-invoked names in a mixin declaration.
class MixinSuperInvokedNamesCollector extends RecursiveAstVisitor<void> {
final Set<String> _names;
MixinSuperInvokedNamesCollector(this._names);
@override
void visitBinaryExpression(BinaryExpression node) {
if (node.leftOperand is SuperExpression) {
_names.add(node.operator.lexeme);
}
super.visitBinaryExpression(node);
}
@override
void visitIndexExpression(IndexExpression node) {
if (node.target is SuperExpression) {
if (node.inGetterContext()) {
_names.add('[]');
}
if (node.inSetterContext()) {
_names.add('[]=');
}
}
super.visitIndexExpression(node);
}
@override
void visitMethodInvocation(MethodInvocation node) {
if (node.target is SuperExpression) {
_names.add(node.methodName.name);
}
super.visitMethodInvocation(node);
}
@override
void visitPrefixExpression(PrefixExpression node) {
if (node.operand is SuperExpression) {
TokenType operatorType = node.operator.type;
if (operatorType == TokenType.MINUS) {
_names.add('unary-');
} else if (operatorType == TokenType.TILDE) {
_names.add('~');
}
}
super.visitPrefixExpression(node);
}
@override
void visitPropertyAccess(PropertyAccess node) {
if (node.target is SuperExpression) {
var name = node.propertyName.name;
if (node.propertyName.inGetterContext()) {
_names.add(name);
}
if (node.propertyName.inSetterContext()) {
_names.add('$name=');
}
}
super.visitPropertyAccess(node);
}
}