Elements. Updates as needed for google3. Change-Id: Ib76bf37a41d2fc0923ccddb1da37599589da3a5f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396571 Reviewed-by: Samuel Rawlins <srawlins@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart index 8a003f3..0916f90 100644 --- a/pkg/analysis_server/lib/src/computer/computer_outline.dart +++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -653,7 +653,7 @@ /// Return `true` if the given [element] is a top-level member of the test /// package. bool _isInsideTestPackage(engine.TopLevelFunctionElement element) { - var parent = element.library2!; + var parent = element.library2; return parent.firstFragment.source.fullName.endsWith('test.dart'); } }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart index df09740..555153a 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart
@@ -186,7 +186,8 @@ var className = enclosingClass.displayName; - var completion = element.displayName; + // TODO(scheglov): Wrong, if no name, should be no completion. + var completion = element.name3 ?? ''; if (suggestUnnamedAsNew) { if (completion.isEmpty) { completion = 'new';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart index 0e42288..d3a2278 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
@@ -465,7 +465,7 @@ prefix: null, isNotImported: true, ); - _addConstructors(library.asElement as LibraryElement, importData); + _addConstructors(library.asElement, importData); } /// Add members from all the applicable extensions that are visible in the @@ -477,7 +477,7 @@ required bool includeMethods, required bool includeSetters, }) { - var libraryElement = library.asElement as LibraryElement; + var libraryElement = library.asElement; var applicableExtensions = library.exportNamespace.definedNames.values .whereType<ExtensionElement>() .applicableTo( @@ -511,7 +511,7 @@ isNotImported: true, ); _addExternalTopLevelDeclarations( - library: library.asElement as LibraryElement, + library: library.asElement, namespace: library.exportNamespace, importData: importData, );
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart index 2cc1327..9979ae4 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
@@ -741,7 +741,7 @@ if (constructorElement == null) { return; } - var libraryElement = state.libraryElement.asElement as LibraryElement; + var libraryElement = state.libraryElement.asElement; declarationHelper( mustBeConstant: constructorElement.isConst, ).addPossibleRedirectionsInLibrary(constructorElement, libraryElement);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart index d7c2e17..c9f99a1 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
@@ -61,7 +61,7 @@ // TODO(brianwilkerson): Use `targetLibrary2` everywhere below and rename it // to `targetLibrary`. - var targetLibrary = targetLibrary2.asElement as LibraryElement; + var targetLibrary = targetLibrary2.asElement; var libUtils = CorrectionUtils(resolveResult); var eol = libUtils.endOfLine; // Prepare information about existing imports.
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart index 4fca766..25e3449 100644 --- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart +++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -304,7 +304,7 @@ ) async { var result = await getHierarchyNamedParameters( searchEngine, - element.asElement as ParameterElement, + element.asElement, ); return result.map((e) => e.asElement2).toList(); }
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart index 8537a74..cbb35ac 100644 --- a/pkg/analyzer/lib/dart/analysis/session.dart +++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -55,6 +55,11 @@ /// with the given library [element]. SomeParsedLibraryResult getParsedLibraryByElement(LibraryElement element); + /// Return information about the results of parsing units of the library file + /// with the given library [element]. + @experimental + SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement2 element); + /// Return information about the results of parsing the file with the given /// absolute, normalized [path]. SomeParsedUnitResult getParsedUnit(String path);
diff --git a/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart index 3740582..48a4796 100644 --- a/pkg/analyzer/lib/dart/constant/value.dart +++ b/pkg/analyzer/lib/dart/constant/value.dart
@@ -71,6 +71,9 @@ /// If this object is the value of a constant variable, the variable. VariableElement? get variable; + /// If this object is the value of a constant variable, the variable. + VariableElement2? get variable2; + /// Return a representation of the value of the field with the given [name]. /// /// Return `null` if either the object being represented does not have a field
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart index c298ef7..ff7c007 100644 --- a/pkg/analyzer/lib/dart/element/element.dart +++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -515,6 +515,9 @@ abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource { /// The library referenced by the [source]. LibraryElement get library; + + /// The library referenced by the [source]. + LibraryElement2 get library2; } /// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI. @@ -1987,6 +1990,9 @@ /// the order in which they were specified. List<NamespaceCombinator> get combinators; + @override + CompilationUnitElement get enclosingElement3; + /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary]. LibraryElement? get exportedLibrary;
diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart index f6f5362..28eb844 100644 --- a/pkg/analyzer/lib/dart/element/element2.dart +++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -495,6 +495,13 @@ /// be changed if doing so would improve the UX. String displayString2({bool multiline = false, bool preferTypeAlias = false}); + /// Returns a display name for the given element that includes the path to the + /// compilation unit in which the type is defined. If [shortName] is `null` + /// then [displayName] will be used as the name of this element. Otherwise + /// the provided name will be used. + // TODO(brianwilkerson): Make the parameter optional. + String getExtendedDisplayName(String? shortName); + /// Whether the element, assuming that it is within scope, is accessible to /// code in the given [library]. /// @@ -1165,6 +1172,28 @@ /// Returns the setter from [setters2] that has the given [name]. SetterElement? getSetter2(String name); + + /// Returns the element representing the getter that results from looking up + /// the given [name] in this class with respect to the given [library], + /// or `null` if the look up fails. + /// + /// The behavior of this method is defined by the Dart Language Specification + /// in section 17.18 Lookup. + PropertyAccessorElement2? lookUpGetter2({ + required String name, + required LibraryElement2 library, + }); + + /// Returns the element representing the method that results from looking up + /// the given [name] in this class with respect to the given [library], + /// or `null` if the look up fails. + /// + /// The behavior of this method is defined by the Dart Language Specification + /// in section 17.18 Lookup. + MethodElement2? lookUpMethod2({ + required String name, + required LibraryElement2 library, + }); } /// The portion of an [InstanceElement2] contributed by a single declaration. @@ -1279,6 +1308,25 @@ required List<DartType> typeArguments, required NullabilitySuffix nullabilitySuffix, }); + + /// Returns the element representing the method that results from looking up + /// the given [methodName] in the superclass of this class with respect to the + /// given [library], or `null` if the look up fails. + /// + /// The behavior of this method is defined by the Dart Language Specification + /// in section 16.15.1: + /// <blockquote> + /// The result of looking up method <i>m</i> in class <i>C</i> with respect to + /// library <i>L</i> is: If <i>C</i> declares an instance method named + /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of + /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the + /// result of the lookup is the result of looking up method <i>m</i> in + /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has + /// failed. + /// </blockquote> + // TODO(scheglov): Deprecate and remove it. + MethodElement2? lookUpInheritedMethod2( + String methodName, LibraryElement2 library); } /// The portion of an [InterfaceElement2] contributed by a single declaration. @@ -1455,6 +1503,12 @@ /// of this element's parent. String get identifier; + /// The libraries that are imported into this library. + /// + /// This includes all of the libraries that are imported using a prefix, and + /// those that are imported without a prefix. + List<LibraryElement2> get importedLibraries2; + /// Whether the library is the `dart:async` library. bool get isDartAsync; @@ -1902,6 +1956,9 @@ /// The test might be based on the name of the executable element, in which /// case the result will be correct when the name is legal. bool get isOperator; + + @override + LibraryElement2 get library2; } /// The portion of a [MethodElement2] contributed by a single declaration. @@ -2352,6 +2409,9 @@ /// /// A top-level function is an entry point if it has the name `main`. bool get isEntryPoint; + + @override + LibraryElement2 get library2; } /// The portion of a [TopLevelFunctionElement] contributed by a single
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart index 333fdcb..52d5107 100644 --- a/pkg/analyzer/lib/dart/element/type.dart +++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -420,6 +420,24 @@ bool recoveryStatic = false, }); + /// Return the getter with the given [name]. + /// + /// If [concrete] is `true`, then the concrete implementation is returned, + /// from this type, or its superclass. + /// + /// If [inherited] is `true`, then only getters from the superclass are + /// considered. + /// + /// If [recoveryStatic] is `true`, then static getters of the class, + /// and its superclasses are considered. Clients should not use it. + GetterElement? lookUpGetter3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }); + /// Return the method with the given [name]. /// /// If [concrete] is `true`, then the concrete implementation is returned, @@ -438,6 +456,24 @@ bool recoveryStatic = false, }); + /// Return the method with the given [name]. + /// + /// If [concrete] is `true`, then the concrete implementation is returned, + /// from this type, or its superclass. + /// + /// If [inherited] is `true`, then only methods from the superclass are + /// considered. + /// + /// If [recoveryStatic] is `true`, then static methods of the class, + /// and its superclasses are considered. Clients should not use it. + MethodElement2? lookUpMethod3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }); + /// Return the setter with the given [name]. /// /// If [concrete] is `true`, then the concrete implementation is returned, @@ -455,6 +491,24 @@ bool inherited = false, bool recoveryStatic = false, }); + + /// Return the setter with the given [name]. + /// + /// If [concrete] is `true`, then the concrete implementation is returned, + /// from this type, or its superclass. + /// + /// If [inherited] is `true`, then only setters from the superclass are + /// considered. + /// + /// If [recoveryStatic] is `true`, then static setters of the class, + /// and its superclasses are considered. Clients should not use it. + SetterElement? lookUpSetter3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }); } /// The type arising from code with errors, such as invalid type annotations,
diff --git a/pkg/analyzer/lib/dart/element/visitor2.dart b/pkg/analyzer/lib/dart/element/visitor2.dart index 41bc9c5f..bcea781 100644 --- a/pkg/analyzer/lib/dart/element/visitor2.dart +++ b/pkg/analyzer/lib/dart/element/visitor2.dart
@@ -120,7 +120,7 @@ @override R? visitGetterElement(GetterElement element) => - visitExecutableElement(element); + visitPropertyAccessorElement(element); @override R? visitLabelElement(LabelElement2 element) { @@ -156,12 +156,15 @@ return visitElement(element); } + R? visitPropertyAccessorElement(PropertyAccessorElement2 element) => + visitExecutableElement(element); + R? visitPropertyInducingElement(PropertyInducingElement2 element) => visitVariableElement(element); @override R? visitSetterElement(SetterElement element) => - visitExecutableElement(element); + visitPropertyAccessorElement(element); @override R? visitSuperFormalParameterElement(SuperFormalParameterElement2 element) =>
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart index 99291c8..d63eac5 100644 --- a/pkg/analyzer/lib/src/dart/analysis/session.dart +++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -105,6 +105,17 @@ } @override + SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement2 element) { + checkConsistency(); + + if (element.session != this) { + return NotElementOfThisSessionResult(); + } + + return _driver.getParsedLibraryByUri(element.uri); + } + + @override SomeParsedUnitResult getParsedUnit(String path) { checkConsistency(); return _driver.parseFileSync(path);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index 10afec6..2bd994d 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -10,6 +10,7 @@ import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; @@ -519,6 +520,9 @@ /// The library with this constant. LibraryElement? get library; + + /// The library with this constant. + LibraryElement2? get library2; } /// A visitor used to evaluate constant expressions to produce their
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart index 00f4a45..840d86c 100644 --- a/pkg/analyzer/lib/src/dart/constant/value.dart +++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -156,6 +156,9 @@ ConstructorInvocation( this.constructor, this._argumentValues, this.namedArguments); + /// The constructor that was called. + ConstructorElement2 get constructor2 => constructor.asElement2; + /// The positional arguments passed to the constructor. List<DartObjectImpl> get positionalArguments { var result = <DartObjectImpl>[]; @@ -279,6 +282,9 @@ List<DartType>? get typeArguments => (state as FunctionState).typeArguments; @override + VariableElement2? get variable2 => variable.asElement2 as VariableElement2?; + + @override bool operator ==(Object other) { if (other is DartObjectImpl) { return _typeSystem.runtimeTypesEqual(type, other.type) &&
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index 5f14b9f..b2312d7 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -31,6 +31,7 @@ import 'package:analyzer/src/dart/constant/value.dart'; import 'package:analyzer/src/dart/element/display_string_builder.dart'; import 'package:analyzer/src/dart/element/field_name_non_promotability_info.dart'; +import 'package:analyzer/src/dart/element/inheritance_manager3.dart'; import 'package:analyzer/src/dart/element/member.dart'; import 'package:analyzer/src/dart/element/name_union.dart'; import 'package:analyzer/src/dart/element/scope.dart'; @@ -1584,6 +1585,17 @@ ConstructorElement2 get baseElement => this; @override + String get displayName { + var className = enclosingElement2.name3 ?? '<null>'; + var name = name3 ?? '<null>'; + if (name != 'new') { + return '$className.$name'; + } else { + return className; + } + } + + @override InterfaceElementImpl2 get enclosingElement2 => firstFragment.enclosingElement3.element; @@ -1866,6 +1878,9 @@ required super.relativeUri, required super.source, }); + + @override + LibraryElement2 get library2 => library; } class DirectiveUriWithRelativeUriImpl @@ -2347,6 +2362,9 @@ @override LibraryElement get library => compilationUnit.library; + @override + LibraryElement2 get library2 => compilationUnit.library; + /// Get the library containing this annotation. @override Source get librarySource => compilationUnit.librarySource; @@ -3323,6 +3341,13 @@ } @override + String getExtendedDisplayName(String? shortName) { + shortName ??= displayName; + var source = firstFragment.libraryFragment?.source; + return "$shortName (${source?.fullName})"; + } + + @override bool isAccessibleIn2(LibraryElement2 library) { var name3 = this.name3; if (name3 == null || Identifier.isPrivateName(name3)) { @@ -5549,6 +5574,17 @@ } @override + PropertyAccessorElement2? lookUpGetter2({ + required String name, + required LibraryElement2 library, + }) { + return lookUpGetter( + name: name, + library: library.asElement, + )?.asElement2; + } + + @override MethodElement? lookUpMethod({ required String name, required LibraryElement library, @@ -5558,6 +5594,17 @@ } @override + MethodElement2? lookUpMethod2({ + required String name, + required LibraryElement2 library, + }) { + return lookUpMethod( + name: name, + library: library.asElement, + )?.asElement2; + } + + @override PropertyAccessorElement? lookUpSetter({ required String name, required LibraryElement library, @@ -6186,6 +6233,11 @@ @override InterfaceElementImpl get firstFragment; + InheritanceManager3 get inheritanceManager { + var library = library2 as LibraryElementImpl; + return library.session.inheritanceManager; + } + @override List<InterfaceType> get mixins { if (firstFragment.mixinInferenceCallback case var callback?) { @@ -6252,6 +6304,19 @@ }) => firstFragment.instantiate( typeArguments: typeArguments, nullabilitySuffix: nullabilitySuffix); + + @override + MethodElement2? lookUpInheritedMethod2( + String methodName, + LibraryElement2 library, + ) { + return inheritanceManager + .getInherited4( + this, + Name.forLibrary(library, methodName), + ) + .ifTypeOrNull(); + } } class JoinPatternVariableElementImpl extends PatternVariableElementImpl @@ -6543,13 +6608,15 @@ List<Element2> get children2 { return [ ...classes, + ...enums, ...extensions, ...extensionTypes, - ...topLevelFunctions, - ...mixins, - ...typeAliases, ...getters, + ...mixins, + ...setters, + ...topLevelFunctions, ...topLevelVariables, + ...typeAliases, ]; } @@ -6687,6 +6754,16 @@ } @override + List<LibraryElement2> get importedLibraries2 { + return fragments + .expand((fragment) => fragment.libraryImports2) + .map((import) => import.importedLibrary2) + .nonNulls + .toSet() + .toList(); + } + + @override bool get isDartAsync => name == "dart.async"; @override @@ -6970,6 +7047,11 @@ } @override + CompilationUnitElementImpl get enclosingElement3 { + return super.enclosingElement3 as CompilationUnitElementImpl; + } + + @override LibraryElementImpl? get exportedLibrary { var uri = this.uri; if (uri is DirectiveUriWithLibraryImpl) { @@ -7849,6 +7931,9 @@ ElementKind get kind => ElementKind.METHOD; @override + LibraryElement2 get library2 => super.library2!; + + @override String? get lookupName { if (name3 == '-' && formalParameters.isEmpty) { return 'unary-'; @@ -10006,6 +10091,9 @@ ElementKind get kind => ElementKind.FUNCTION; @override + LibraryElement2 get library2 => super.library2!; + + @override String? get name3 => firstFragment.name; @override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart index 0053c66..608216a 100644 --- a/pkg/analyzer/lib/src/dart/element/member.dart +++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -996,6 +996,9 @@ MethodFragment get firstFragment => _element2.firstFragment; @override + LibraryElement2 get library2 => _element2.library2; + + @override String? get lookupName => name3; @override @@ -1519,6 +1522,9 @@ LibraryElement get library => _declaration.library!; @override + LibraryElement2 get library2 => _declaration.library as LibraryElement2; + + @override String get name => declaration.name; @override
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart index 146b99b..02f5181 100644 --- a/pkg/analyzer/lib/src/dart/element/type.dart +++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -17,6 +17,8 @@ import 'package:analyzer/src/dart/element/type_algebra.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; import 'package:analyzer/src/utilities/extensions/collection.dart'; +import 'package:analyzer/src/utilities/extensions/element.dart'; +import 'package:analyzer/src/utilities/extensions/object.dart'; import 'package:collection/collection.dart'; /// Returns a [List] of fixed length with given types. @@ -751,7 +753,7 @@ @override List<MethodElement2> get methods2 => - methods.map((fragment) => (fragment as MethodFragment).element).toList(); + methods.map((e) => e.asElement2).toList(); @override List<InterfaceType> get mixins { @@ -953,6 +955,23 @@ } @override + GetterElement? lookUpGetter3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }) { + return lookUpGetter2( + name, + library.asElement, + concrete: concrete, + inherited: inherited, + recoveryStatic: recoveryStatic, + )?.asElement2.ifTypeOrNull(); + } + + @override MethodElement? lookUpMethod2( String name, LibraryElement library, { @@ -992,6 +1011,23 @@ } @override + MethodElement2? lookUpMethod3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }) { + return lookUpMethod2( + name, + library.asElement, + concrete: concrete, + inherited: inherited, + recoveryStatic: recoveryStatic, + )?.asElement2; + } + + @override PropertyAccessorElement? lookUpSetter2( String name, LibraryElement library, { @@ -1031,6 +1067,23 @@ } @override + SetterElement? lookUpSetter3( + String name, + LibraryElement2 library, { + bool concrete = false, + bool inherited = false, + bool recoveryStatic = false, + }) { + return lookUpSetter2( + name, + library.asElement, + concrete: concrete, + inherited: inherited, + recoveryStatic: recoveryStatic, + )?.asElement2.ifTypeOrNull(); + } + + @override bool referencesAny(Set<TypeParameterElement> parameters) { return typeArguments.any((argument) { var argumentImpl = argument as TypeImpl;
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart index 5ecb605..fdbe847 100644 --- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart +++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -4,10 +4,12 @@ import 'package:analyzer/dart/ast/syntactic_entity.dart'; import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/error/hint_codes.dart'; +import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:analyzer/src/workspace/workspace.dart'; import 'package:collection/collection.dart'; @@ -113,7 +115,14 @@ } void reportError(SyntacticEntity errorEntity, Element element, - String displayName, String? message); + String displayName, String? message) { + reportError2(errorEntity, element.asElement2!, displayName, message); + } + + void reportError2(SyntacticEntity errorEntity, Element2 element, + String displayName, String? message) { + reportError(errorEntity, element.asElement!, displayName, message); + } void simpleIdentifier(SimpleIdentifier node) { // Don't report declared identifiers.
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart index f58fa7e..8c8c85c 100644 --- a/pkg/analyzer/lib/src/utilities/extensions/element.dart +++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -11,6 +11,12 @@ import 'package:analyzer/src/dart/element/member.dart'; import 'package:meta/meta.dart'; +extension ClassElement2Extension on ClassElement2 { + ClassElement get asElement { + return firstFragment as ClassElement; + } +} + extension ClassElementExtension on ClassElement { ClassElement2 get asElement2 { return (this as ClassElementImpl).element; @@ -18,6 +24,10 @@ } extension CompilationUnitElementExtension on CompilationUnitElement { + LibraryFragment get asElement2 { + return this as LibraryFragment; + } + /// Returns this library fragment, and all its enclosing fragments. List<CompilationUnitElement> get withEnclosing { var result = <CompilationUnitElement>[]; @@ -34,6 +44,12 @@ } } +extension ConstructorElement2Extension on ConstructorElement2 { + ConstructorElement get asElement { + return baseElement.firstFragment as ConstructorElement; + } +} + extension ConstructorElementExtension on ConstructorElement { ConstructorElement2 get asElement2 { return switch (this) { @@ -44,10 +60,21 @@ } } +extension Element2Extension on Element2 { + List<ElementAnnotation> get metadata { + if (this case Annotatable annotatable) { + return annotatable.metadata2.annotations; + } + return []; + } +} + extension Element2OrNullExtension on Element2? { Element? get asElement { var self = this; switch (self) { + case null: + return null; case ConstructorElementImpl2(): return self.firstFragment as Element; case DynamicElementImpl(): @@ -58,10 +85,12 @@ return self.firstFragment as Element; case FieldMember(): return self.declaration as Element; - case FormalParameterElementImpl(): - return self.firstFragment as Element; + case FormalParameterElement element2: + return element2.asElement; case GetterElementImpl(): return self.firstFragment as Element; + case LabelElementImpl2 element2: + return element2.asElement; case LibraryElementImpl(): return self as Element; case LocalFunctionElementImpl(): @@ -74,6 +103,8 @@ return element2.asElement; case NeverElementImpl2(): return NeverElementImpl.instance; + case PrefixElement2 element2: + return element2.asElement; case SetterElementImpl(): return self.firstFragment as Element; case TopLevelFunctionElementImpl(): @@ -83,7 +114,7 @@ case TypeDefiningElement2(): return self.firstFragment as Element; default: - return null; + throw UnsupportedError('Unsupported type: $runtimeType'); } } } @@ -267,6 +298,10 @@ } extension FormalParameterExtension on FormalParameterElement { + ParameterElement get asElement { + return firstFragment as ParameterElement; + } + void appendToWithoutDelimiters( StringBuffer buffer, { @Deprecated('Only non-nullable by default mode is supported') @@ -299,9 +334,34 @@ } } +extension InterfaceTypeExtension on InterfaceType { + MethodElement2? getMethod2(String name) { + return getMethod(name)?.asElement2; + } +} + +extension LabelElement2Extension on LabelElement2 { + LabelElement get asElement { + return firstFragment as LabelElement; + } +} + +extension LibraryElement2Extension on LibraryElement2 { + LibraryElement get asElement { + return this as LibraryElement; + } +} + extension LibraryElementExtension on LibraryElement { LibraryElement2 get asElement2 { - return this as LibraryElementImpl; + return this as LibraryElement2; + } +} + +extension LibraryExportElementExtension on LibraryExportElement { + LibraryExport get asElement2 { + var index = enclosingElement3.libraryExports.indexOf(this); + return enclosingElement3.asElement2.libraryExports2[index]; } } @@ -323,6 +383,13 @@ } } +extension LibraryImportElementExtension on LibraryImportElement { + LibraryImport get asElement2 { + var index = enclosingElement3.libraryImports.indexOf(this); + return enclosingElement3.asElement2.libraryImports2[index]; + } +} + extension ListOfTypeParameterElementExtension on List<TypeParameterElement> { List<TypeParameterType> instantiateNone() { return map((e) { @@ -391,6 +458,12 @@ } } +extension TopLevelVariableElement2Extension on TopLevelVariableElement2 { + TopLevelVariableElement get asElement { + return baseElement.firstFragment as TopLevelVariableElement; + } +} + extension TopLevelVariableElementExtension on TopLevelVariableElement { TopLevelVariableElement2 get asElement2 { return (this as TopLevelVariableElementImpl).element;
diff --git a/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart b/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart index 45ef370..d4db4e9 100644 --- a/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart +++ b/pkg/analyzer/lib/src/wolf/ir/ast_to_ir.dart
@@ -724,7 +724,7 @@ isNullAware: false, previousNestingLevel: previousNestingLevel); // Stack: arguments - if (methodElement.library2!.isDartCore && + if (methodElement.library2.isDartCore && methodElement.name3 == 'identical') { ir.identical(); } else {
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart index 65af9cc..8d2fd2e 100644 --- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -1314,7 +1314,7 @@ constructorName: ConstructorName type: NamedType name: prefix - element: <null> + element: <testLibraryFragment>::@prefix::prefix element2: <testLibraryFragment>::@prefix2::prefix type: InvalidType staticElement: <null>
diff --git a/pkg/analyzer/test/src/dart/resolution/named_type_test.dart b/pkg/analyzer/test/src/dart/resolution/named_type_test.dart index 07bd281..dc12bd6 100644 --- a/pkg/analyzer/test/src/dart/resolution/named_type_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/named_type_test.dart
@@ -605,7 +605,7 @@ assertResolvedNodeText(node, r''' NamedType name: prefix - element: <null> + element: <testLibraryFragment>::@prefix::prefix element2: <testLibraryFragment>::@prefix2::prefix type: InvalidType '''); @@ -633,7 +633,7 @@ element2: dart:core::@class::int type: int rightBracket: > - element: <null> + element: <testLibraryFragment>::@prefix::prefix element2: <testLibraryFragment>::@prefix2::prefix type: InvalidType ''');
diff --git a/pkg/linter/lib/src/rules/discarded_futures.dart b/pkg/linter/lib/src/rules/discarded_futures.dart index 447532b..0d5faf8 100644 --- a/pkg/linter/lib/src/rules/discarded_futures.dart +++ b/pkg/linter/lib/src/rules/discarded_futures.dart
@@ -131,6 +131,6 @@ var self = this; return self is TopLevelFunctionElement && self.name3 == 'unawaited' && - (self.library2?.isDartAsync ?? false); + self.library2.isDartAsync; } }
diff --git a/pkg/linter/lib/src/rules/use_test_throws_matchers.dart b/pkg/linter/lib/src/rules/use_test_throws_matchers.dart index ba4db790..221d861 100644 --- a/pkg/linter/lib/src/rules/use_test_throws_matchers.dart +++ b/pkg/linter/lib/src/rules/use_test_throws_matchers.dart
@@ -39,7 +39,7 @@ if (expression is! MethodInvocation) return false; var element = expression.methodName.element; return element is TopLevelFunctionElement && - element.library2?.uri == + element.library2.uri == Uri.parse('package:test_api/src/frontend/expect.dart') && element.name3 == functionName; }
diff --git a/pkg/linter/lib/src/rules/use_truncating_division.dart b/pkg/linter/lib/src/rules/use_truncating_division.dart index 07ba6a6..8fd8988 100644 --- a/pkg/linter/lib/src/rules/use_truncating_division.dart +++ b/pkg/linter/lib/src/rules/use_truncating_division.dart
@@ -50,7 +50,7 @@ if (methodElement == null) return; var libraryElement = methodElement.library2; - if (libraryElement != null && !libraryElement.isDartCore) return; + if (!libraryElement.isDartCore) return; var parent = node.parent; if (parent is! ParenthesizedExpression) return;