blob: d274eb8f629574cec87171efe255fb91f4045854 [file] [log] [blame]
// Copyright (c) 2021, 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/src/dart/resolver/lexical_lookup.dart';
import 'package:analyzer/src/generated/resolver.dart';
/// Class containing static methods for resolving identifiers as implicit
/// property gets/sets on the type of `this`.
class ThisLookup {
/// Do not construct
ThisLookup._() {
assert(false, 'Do not construct instances of LexicalLookup');
}
/// Attempts to resolve an identifier with name [id] via implicit `this.`,
/// assuming we are trying to look up a getter. If a matching element is
/// found, a [LexicalLookupResult] is returned. Otherwise `null` is returned.
static LexicalLookupResult? lookupGetter(
ResolverVisitor resolver, SimpleIdentifier node) {
var id = node.name;
var thisType = resolver.thisType;
if (thisType == null) {
return null;
}
var propertyResult = resolver.typePropertyResolver.resolve(
receiver: null,
receiverType: thisType,
name: id,
propertyErrorEntity: node,
nameErrorEntity: node,
);
var getterElement = propertyResult.getter;
if (getterElement != null) {
return LexicalLookupResult(requested: getterElement);
} else {
return LexicalLookupResult(recovery: propertyResult.setter);
}
}
/// Attempts to resolve an identifier with name [id] via implicit `this.`,
/// assuming we are trying to look up a setter. If a matching element is
/// found, a [LexicalLookupResult] is returned. Otherwise `null` is returned.
static LexicalLookupResult? lookupSetter(
ResolverVisitor resolver, SimpleIdentifier node) {
var id = node.name;
var thisType = resolver.thisType;
if (thisType == null) {
return null;
}
var propertyResult = resolver.typePropertyResolver.resolve(
receiver: null,
receiverType: thisType,
name: id,
propertyErrorEntity: node,
nameErrorEntity: node,
);
var setterElement = propertyResult.setter;
if (setterElement != null) {
return LexicalLookupResult(requested: setterElement);
} else {
return LexicalLookupResult(recovery: propertyResult.getter);
}
}
}