blob: b683c9182d71b7dffd08aad5d5e7fa52e588a792 [file] [log] [blame]
// Copyright (c) 2020, 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/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/ast.dart';
/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
Element _writeElement(AstNode node) {
var parent = node.parent;
if (parent is AssignmentExpression && parent.leftHandSide == node) {
return parent.writeElement;
}
if (parent is PostfixExpression && parent.operand == node) {
return parent.writeElement;
}
if (parent is PrefixExpression && parent.operand == node) {
return parent.writeElement;
}
if (parent is PrefixedIdentifier && parent.identifier == node) {
return _writeElement(parent);
}
if (parent is PropertyAccess && parent.propertyName == node) {
return _writeElement(parent);
}
return null;
}
/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
DartType _writeType(AstNode node) {
var parent = node.parent;
if (parent is AssignmentExpression && parent.leftHandSide == node) {
return parent.writeType;
}
if (parent is PostfixExpression && parent.operand == node) {
return parent.writeType;
}
if (parent is PrefixExpression && parent.operand == node) {
return parent.writeType;
}
if (parent is PrefixedIdentifier && parent.identifier == node) {
return _writeType(parent);
}
if (parent is PropertyAccess && parent.propertyName == node) {
return _writeType(parent);
}
return null;
}
extension FormalParameterExtension on FormalParameter {
FormalParameter get notDefault {
var self = this;
if (self is DefaultFormalParameter) {
return self.parameter;
}
return self;
}
AstNode get typeOrSelf {
var self = this;
if (self is SimpleFormalParameter) {
return self.type;
}
return self;
}
}
/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
extension IdentifierExtension on Identifier {
Element get writeOrReadElement {
return _writeElement(this) ?? staticElement;
}
DartType get writeOrReadType {
return _writeType(this) ?? staticType;
}
}
/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
extension IndexExpressionExtension on IndexExpression {
Element get writeOrReadElement {
return _writeElement(this) ?? staticElement;
}
}
extension ListOfFormalParameterExtension on List<FormalParameter> {
Iterable<FormalParameterImpl> get asImpl {
return cast<FormalParameterImpl>();
}
}