diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart index 0a0a1e6f2d7..fcbceefecc9 100644 --- a/pkg/analyzer/lib/dart/element/element.dart +++ b/pkg/analyzer/lib/dart/element/element.dart @@ -1237,6 +1237,10 @@ abstract class FunctionElement implements ExecutableElement, LocalElement { /// invoke an undefined method on an object. static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod"; + /// Return `true` if this function represents `identical` from the + /// `dart:core` library. + bool get isDartCoreIdentical; + /// Return `true` if the function is an entry point, i.e. a top-level function /// and has the name `main`. bool get isEntryPoint; diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart index 66503bc0001..6c13da9a3c0 100644 --- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart +++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart @@ -269,9 +269,9 @@ class _Collector { void _methodInvocation(MethodInvocation node) { var arguments = node.argumentList.arguments; - if (arguments.length == 2 && node.methodName.name == 'identical') { - var library = node.methodName.staticElement?.library; - if (library?.isDartCore == true) { + if (arguments.length == 2) { + var element = node.methodName.staticElement; + if (element is FunctionElement && element.isDartCoreIdentical) { collect(arguments[0]); collect(arguments[1]); return; diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index 8a9ab33d15a..d33f0638189 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -3348,6 +3348,11 @@ class FunctionElementImpl extends ExecutableElementImpl return identifier; } + @override + bool get isDartCoreIdentical { + return isStatic && name == 'identical' && library.isDartCore; + } + @override bool get isEntryPoint { return isStatic && displayName == FunctionElement.MAIN_FUNCTION_NAME; diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart index f6195f18128..8d8f03d2d5d 100644 --- a/pkg/analyzer/lib/src/dart/element/member.dart +++ b/pkg/analyzer/lib/src/dart/element/member.dart @@ -418,6 +418,9 @@ class FunctionMember extends ExecutableMember implements FunctionElement { @override Element get enclosingElement => declaration.enclosingElement; + @override + bool get isDartCoreIdentical => declaration.isDartCoreIdentical; + @override bool get isEntryPoint => declaration.isEntryPoint; diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart index 41fc38e2c44..03746207f9b 100644 --- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart +++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart @@ -461,8 +461,7 @@ class MethodInvocationInferrer bool _isIdentical(MethodInvocationImpl node) { var invokedMethod = node.methodName.staticElement; return invokedMethod is FunctionElement && - invokedMethod.name == 'identical' && - invokedMethod.library.isDartCore && + invokedMethod.isDartCoreIdentical && node.argumentList.arguments.length == 2; }