blob: 228c1d71f1de5723e8a5a0b06f2318395d204b1f [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
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);
}
}