blob: 3971a35e5767f38e3f8b86461a5edfab741f5142 [file] [log] [blame]
// Copyright (c) 2019, 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/type_provider.dart';
/// Determines whether a type annotation's position in the AST makes it
/// impossible to be nullable.
bool typeIsNonNullableByContext(TypeAnnotation node) {
var parent = node.parent;
return parent is ExtendsClause ||
parent is ImplementsClause ||
parent is WithClause ||
parent is OnClause ||
parent is ClassTypeAlias ||
parent is GenericTypeAlias ||
parent is ConstructorName;
}
/// This mixin provides utilities that are useful to visitors implementing
/// resolution-like behaviors.
mixin ResolutionUtils {
List<String>? _objectGetNames;
TypeProvider get typeProvider;
/// Determines whether the given getter or method name is declared on
/// `Object` (and is hence valid to call on a nullable type).
bool isDeclaredOnObject(String name) =>
(_objectGetNames ??= _computeObjectGetNames()).contains(name);
List<String> _computeObjectGetNames() {
var result = <String>[];
var objectClass = typeProvider.objectType.element;
for (var accessor in objectClass.accessors) {
assert(accessor.isGetter);
assert(!accessor.name.startsWith('_'));
result.add(accessor.name);
}
for (var method in objectClass.methods) {
assert(!method.name.startsWith('_'));
result.add(method.name);
}
return result;
}
}