Skip to content

Commit

Permalink
Consider '[]' and '[]=' as having the same base name '[]' for extensi…
Browse files Browse the repository at this point in the history
…ons.

Update ResolutionResult to be just getter and setter.
No properties, no functions.

Bug: #38484
Change-Id: If2b50e30eb98eb280142bbe12e4f0c31041ef652
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118342
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
  • Loading branch information
scheglov authored and commit-bot@chromium.org committed Sep 21, 2019
1 parent 73eb0ee commit a683a58
Show file tree
Hide file tree
Showing 6 changed files with 285 additions and 250 deletions.
53 changes: 37 additions & 16 deletions pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -291,17 +291,38 @@ class ExtensionMemberResolver {
for (var field in extension.fields) {
if (field.name == name) {
candidates.add(
_CandidateExtension(extension, field: field),
_CandidateExtension(
extension,
getter: field.getter,
setter: field.setter,
),
);
return;
}
}
for (var method in extension.methods) {
if (method.name == name) {
if (name == '[]') {
ExecutableElement getter;
ExecutableElement setter;
for (var method in extension.methods) {
if (method.name == '[]') {
getter = method;
} else if (method.name == '[]=') {
setter = method;
}
}
if (getter != null || setter != null) {
candidates.add(
_CandidateExtension(extension, method: method),
_CandidateExtension(extension, getter: getter, setter: setter),
);
return;
}
} else {
for (var method in extension.methods) {
if (method.name == name) {
candidates.add(
_CandidateExtension(extension, getter: method),
);
return;
}
}
}
}
Expand Down Expand Up @@ -429,11 +450,11 @@ class ExtensionMemberResolver {

class _CandidateExtension {
final ExtensionElement extension;
final FieldElement field;
final MethodElement method;
final ExecutableElement getter;
final ExecutableElement setter;

_CandidateExtension(this.extension, {this.field, this.method})
: assert(field != null || method != null);
_CandidateExtension(this.extension, {this.getter, this.setter})
: assert(getter != null || setter != null);
}

class _InstantiatedExtension {
Expand All @@ -444,22 +465,22 @@ class _InstantiatedExtension {
_InstantiatedExtension(this.candidate, this.substitution, this.extendedType);

ResolutionResult get asResolutionResult {
return ResolutionResult(function: method, property: field);
return ResolutionResult(getter: getter, setter: setter);
}

ExtensionElement get extension => candidate.extension;

FieldElement get field {
if (candidate.field == null) {
ExecutableElement get getter {
if (candidate.getter == null) {
return null;
}
return FieldMember.from2(candidate.field, substitution);
return ExecutableMember.from2(candidate.getter, substitution);
}

MethodElement get method {
if (candidate.method == null) {
ExecutableElement get setter {
if (candidate.setter == null) {
return null;
}
return MethodMember.from2(candidate.method, substitution);
return ExecutableMember.from2(candidate.setter, substitution);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ class MethodInvocationResolver {
var result = _extensionResolver.findExtension(
type, _nameCall.name, node.methodName);
if (result.isSingle) {
call = result.function;
call = result.getter;
} else if (result.isAmbiguous) {
return;
}
Expand Down
35 changes: 13 additions & 22 deletions pkg/analyzer/lib/src/dart/resolver/resolution_result.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import 'package:analyzer/dart/element/element.dart';

/// The result of attempting to resolve an identifier to a element.
/// The result of attempting to resolve an identifier to elements.
class ResolutionResult {
/// An instance that can be used anywhere that no element was found.
static const ResolutionResult none =
Expand All @@ -17,27 +17,22 @@ class ResolutionResult {
/// The state of the result.
final _ResolutionResultState state;

/// The function that was found, or `null` if the [state] is not
/// [_ResolutionResultState.single], or a [property] was found.
final ExecutableElement function;
/// Return the element that is invoked for reading.
final ExecutableElement getter;

/// The property that was found, or `null` if the [state] is not
/// [_ResolutionResultState.single], or a [function] was found.
final PropertyInducingElement property;
/// Return the element that is invoked for writing.
final ExecutableElement setter;

/// Initialize a newly created result to represent resolving to a single
/// [function] or [property].
ResolutionResult({this.function, this.property})
: assert(function != null || property != null),
/// Initialize a newly created result to represent resolving a single
/// reading and / or writing result.
ResolutionResult({this.getter, this.setter})
: assert(getter != null || setter != null),
state = _ResolutionResultState.single;

/// Initialize a newly created result with no element and the given [state].
/// Initialize a newly created result with no elements and the given [state].
const ResolutionResult._(this.state)
: function = null,
property = null;

/// Return the getter of the [property], or the [function].
ExecutableElement get getter => function ?? property?.getter;
: getter = null,
setter = null;

/// Return `true` if this result represents the case where multiple ambiguous
/// elements were found.
Expand All @@ -55,12 +50,8 @@ class ResolutionResult {
/// If this is a function, return `true` is the function is static.
/// Otherwise return `false`.
bool get isStatic {
return function?.isStatic ?? property?.isStatic ?? false;
return getter?.isStatic ?? setter?.isStatic ?? false;
}

/// Return the setter of the [property], or `null` if this is not a property,
/// or the property does not have a setter.
ExecutableElement get setter => property?.setter;
}

/// The state of a [ResolutionResult].
Expand Down
Loading

0 comments on commit a683a58

Please sign in to comment.