Version 3.8.0-151.0.dev Merge c9aa87bf26ae37f2fab983bfddb09ad8a9c2bb8f into dev
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart index fe08517..5565722 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -5833,9 +5833,17 @@ bool isDotShorthand = token.next!.isA(TokenType.PERIOD) && (token.next!.next!.isIdentifier || token.next!.next!.isA(Keyword.NEW)); - // TODO(kallentu): Once the parser handles dot shorthands by default, - // we don't need to parse for an error here. - token = parseUnaryExpression(token, allowCascades, constantPatternContext); + if (isDotShorthand) { + // TODO(kallentu): Once the analyzer implementation is done, we can avoid + // adding a synthetic identifier completely, but currently, the parser + // will crash without one. + // + // Insert a synthetic identifier to satisfy listeners. + token = rewriter.insertSyntheticIdentifier(token); + } else { + token = + parseUnaryExpression(token, allowCascades, constantPatternContext); + } Token bangToken = token; if (token.next!.isA(TokenType.BANG)) {
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart index 3d24229..935da45 100644 --- a/pkg/analysis_server/lib/src/status/diagnostics.dart +++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -346,14 +346,14 @@ buf.writeln( '<tr><th>Files Read</th><th>Time Taken</th><th> </th></tr>', ); - for (var i = 0; i < byteStoreTimings.length - 1; i++) { + for (var i = 0; i < byteStoreTimings.length; i++) { var timing = byteStoreTimings[i]; if (timing.readCount == 0) { continue; } var nextTiming = - i <= byteStoreTimings.length ? byteStoreTimings[i + 1] : null; + i + 1 < byteStoreTimings.length ? byteStoreTimings[i + 1] : null; var duration = (nextTiming?.time ?? DateTime.now()).difference( timing.time, ); @@ -491,6 +491,47 @@ } collectedData['uniqueKnownFiles'] = uniqueKnownFiles.length; + // Data from the 'Analysis Driver Timings' page. + var buffer = StringBuffer(); + server.analysisDriverScheduler.accumulatedPerformance.write(buffer: buffer); + collectedData['accumulatedPerformance'] = buffer.toString(); + + // FileByteStore timings + { + var byteStoreTimings = + server.byteStoreTimings + ?.where( + (timing) => + timing.readCount != 0 || timing.readTime != Duration.zero, + ) + .toList(); + if (byteStoreTimings != null && byteStoreTimings.isNotEmpty) { + var performance = []; + collectedData['byteStoreTimings'] = performance; + for (var i = 0; i < byteStoreTimings.length; i++) { + var timing = byteStoreTimings[i]; + if (timing.readCount == 0) { + continue; + } + + var nextTiming = + i + 1 < byteStoreTimings.length ? byteStoreTimings[i + 1] : null; + var duration = (nextTiming?.time ?? DateTime.now()).difference( + timing.time, + ); + var description = + 'Between ${timing.reason} and ${nextTiming?.reason ?? 'now'} ' + '(${printMilliseconds(duration.inMilliseconds)}).'; + + var itemData = {}; + performance.add(itemData); + itemData['file_reads'] = timing.readCount; + itemData['time'] = timing.readTime.inMilliseconds; + itemData['description'] = description; + } + } + } + // Recorded performance data (timing and code completion). void collectPerformance(List<RequestPerformance> items, String type) { var performance = [];
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt index a691b30..629474d 100644 --- a/pkg/analyzer/api.txt +++ b/pkg/analyzer/api.txt
@@ -708,6 +708,7 @@ DeclaredVariablePattern (class extends Object implements VariablePattern): declaredElement (getter: BindPatternVariableElement?) declaredElement2 (getter: BindPatternVariableElement2?) + declaredFragment (getter: BindPatternVariableFragment?) keyword (getter: Token?) type (getter: TypeAnnotation?) DefaultFormalParameter (class extends Object implements FormalParameter): @@ -949,6 +950,7 @@ returnType (getter: TypeAnnotation?) typeParameters (getter: TypeParameterList?) GenericFunctionType (class extends Object implements TypeAnnotation): + declaredFragment (getter: GenericFunctionTypeFragment?) functionKeyword (getter: Token) parameters (getter: FormalParameterList) returnType (getter: TypeAnnotation?) @@ -1049,6 +1051,7 @@ type (getter: TypeAnnotation) Label (class extends Object implements AstNode): colon (getter: Token) + declaredFragment (getter: LabelFragment?) label (getter: SimpleIdentifier) LabeledStatement (class extends Object implements Statement): labels (getter: NodeList<Label>)
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 82bfb61..1fb8935 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -100,7 +100,7 @@ // TODO(scheglov): Clean up the list of implicitly analyzed files. class AnalysisDriver { /// The version of data format, should be incremented on every format change. - static const int DATA_VERSION = 433; + static const int DATA_VERSION = 434; /// The number of exception contexts allowed to write. Once this field is /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart index 7af393a..7d435bb 100644 --- a/pkg/analyzer/lib/src/dart/analysis/index.dart +++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -2,15 +2,12 @@ // 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. -// ignore_for_file: analyzer_use_new_elements - -import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/syntactic_entity.dart'; 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/type.dart'; +import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/ast/extensions.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/summary/format.dart'; @@ -18,11 +15,11 @@ import 'package:collection/collection.dart'; import 'package:meta/meta.dart'; -Element? declaredParameterElement( +Element2? declaredParameterElement( SimpleIdentifier node, - Element? element, + Element2? element, ) { - if (element == null || element.enclosingElement3 != null) { + if (element == null || element.enclosingElement2 != null) { return element; } @@ -30,14 +27,15 @@ /// synthetic [ParameterElement]s, disconnected from the rest of the /// element model. But we want to index these parameter references /// as references to declared parameters. - ParameterElement? namedParameterElement(ExecutableElement? executable) { + FormalParameterElement? namedParameterElement( + ExecutableElement2? executable) { if (executable == null) { return null; } var parameterName = node.name; - return executable.declaration.parameters.where((parameter) { - return parameter.isNamed && parameter.name == parameterName; + return executable.baseElement.formalParameters.where((parameter) { + return parameter.isNamed && parameter.name3 == parameterName; }).first; } @@ -49,11 +47,11 @@ if (argumentList is ArgumentList) { var invocation = argumentList.parent; if (invocation is InstanceCreationExpression) { - var executable = invocation.constructorName.staticElement; + var executable = invocation.constructorName.element; return namedParameterElement(executable); } else if (invocation is MethodInvocation) { - var executable = invocation.methodName.staticElement; - if (executable is ExecutableElement) { + var executable = invocation.methodName.element; + if (executable is ExecutableElement2) { return namedParameterElement(executable); } } @@ -111,16 +109,12 @@ return element; } -/// Return the [CompilationUnitElement] that should be used for [element]. +/// Return the [CompilationUnitElementImpl] that should be used for [element]. /// Throw [StateError] if the [element] is not linked into a unit. -CompilationUnitElement getUnitElement(Element element) { - for (Element? e = element; e != null; e = e.enclosingElement3) { - if (e is CompilationUnitElement) { - return e; - } - if (e is LibraryElement) { - return e.definingCompilationUnit; - } +CompilationUnitElementImpl getUnitElement(Element2 element) { + var result = element.firstFragment.libraryFragment; + if (result case CompilationUnitElementImpl result) { + return result; } throw StateError('Element not contained in compilation unit: $element'); } @@ -135,25 +129,25 @@ final String? classMemberName; final String? unitMemberName; - factory ElementNameComponents(Element element) { + factory ElementNameComponents(Element2 element) { String? parameterName; - if (element is ParameterElement) { - parameterName = element.name; - element = element.enclosingElement3!; + if (element.firstFragment case FormalParameterFragment fragment) { + parameterName = fragment.name2; + element = fragment.enclosingFragment!.element; } String? classMemberName; - if (element.enclosingElement3 is InterfaceElement || - element.enclosingElement3 is ExtensionElement) { - classMemberName = element.name; - element = element.enclosingElement3!; + if (element.enclosingElement2 is InterfaceElement2 || + element.enclosingElement2 is ExtensionElement2) { + classMemberName = element.lookupName; + element = element.enclosingElement2!; } String? unitMemberName; - if (element.enclosingElement3 is CompilationUnitElement) { - unitMemberName = element.name; - if (element is ExtensionElement && unitMemberName == null) { - var enclosingUnit = element.enclosingElement3; + if (element.firstFragment.enclosingFragment is CompilationUnitElementImpl) { + unitMemberName = element.lookupName; + if (element is ExtensionElement2 && unitMemberName == null) { + var enclosingUnit = element.enclosingElement2; var indexOf = enclosingUnit.extensions.indexOf(element); unitMemberName = 'extension-$indexOf'; } @@ -178,10 +172,10 @@ /// corresponding non-synthetic field and [IndexSyntheticElementKind.getter] as /// the [kind]. class IndexElementInfo { - final Element element; + final Element2 element; final IndexSyntheticElementKind kind; - factory IndexElementInfo(Element element) { + factory IndexElementInfo(Element2 element) { IndexSyntheticElementKind kind = IndexSyntheticElementKind.notSynthetic; ElementKind elementKind = element.kind; if (elementKind == ElementKind.LIBRARY || @@ -190,44 +184,44 @@ } else if (element.isSynthetic) { if (elementKind == ElementKind.CONSTRUCTOR) { kind = IndexSyntheticElementKind.constructor; - element = element.enclosingElement3!; - } else if (element is FunctionElement && - element.name == FunctionElement.LOAD_LIBRARY_NAME) { + element = element.enclosingElement2!; + } else if (element is TopLevelFunctionElement && + element.name3 == TopLevelFunctionElement.LOAD_LIBRARY_NAME) { kind = IndexSyntheticElementKind.loadLibrary; - element = element.library; + element = element.library2; } else if (elementKind == ElementKind.FIELD) { - var field = element as FieldElement; + var field = element as FieldElement2; kind = IndexSyntheticElementKind.field; - element = (field.getter ?? field.setter)!; + element = (field.getter2 ?? field.setter2)!; } else if (elementKind == ElementKind.GETTER || elementKind == ElementKind.SETTER) { - var accessor = element as PropertyAccessorElement; - Element enclosing = element.enclosingElement3; - bool isEnumGetter = enclosing is EnumElement; - if (isEnumGetter && accessor.name == 'index') { + var accessor = element as PropertyAccessorElement2; + var enclosing = element.enclosingElement2; + bool isEnumGetter = enclosing is EnumElement2; + if (isEnumGetter && accessor.name3 == 'index') { kind = IndexSyntheticElementKind.enumIndex; element = enclosing; - } else if (isEnumGetter && accessor.name == 'values') { + } else if (isEnumGetter && accessor.name3 == 'values') { kind = IndexSyntheticElementKind.enumValues; element = enclosing; } else { - kind = accessor.isGetter + kind = accessor is GetterElement ? IndexSyntheticElementKind.getter : IndexSyntheticElementKind.setter; - if (accessor.variable2 case var variable?) { + if (accessor.variable3 case var variable?) { element = variable; } } - } else if (element is MethodElement) { - Element enclosing = element.enclosingElement3; - bool isEnumMethod = enclosing is EnumElement; - if (isEnumMethod && element.name == 'toString') { + } else if (element is MethodElement2) { + var enclosing = element.enclosingElement2; + bool isEnumMethod = enclosing is EnumElement2; + if (isEnumMethod && element.name3 == 'toString') { kind = IndexSyntheticElementKind.enumToString; element = enclosing; } - } else if (element is TopLevelVariableElement) { + } else if (element is TopLevelVariableElement2) { kind = IndexSyntheticElementKind.topLevelVariable; - element = (element.getter ?? element.setter)!; + element = (element.getter2 ?? element.setter2)!; } else { throw ArgumentError( 'Unsupported synthetic element ${element.runtimeType}'); @@ -241,7 +235,8 @@ /// Information about an element referenced in index. class _ElementInfo { - /// The identifier of the [CompilationUnitElement] containing this element. + /// The identifier of the [CompilationUnitElementImpl] containing the first + /// fragment of this element. final int unitId; /// The identifier of the top-level name, or `null` if the element is a @@ -295,20 +290,20 @@ static const _nullString = '--nullString--'; /// Map associating referenced elements with their [_ElementInfo]s. - final Map<Element, _ElementInfo> elementMap = {}; + final Map<Element2, _ElementInfo> elementMap = {}; - /// Map associating [CompilationUnitElement]s with their identifiers, which - /// are indices into [unitLibraryUris] and [unitUnitUris]. - final Map<CompilationUnitElement, int> unitMap = {}; + /// Map associating [CompilationUnitElementImpl]s with their identifiers, + /// which are indices into [unitLibraryUris] and [unitUnitUris]. + final Map<CompilationUnitElementImpl, int> unitMap = {}; /// The fields [unitLibraryUris] and [unitUnitUris] are used together to - /// describe each unique [CompilationUnitElement]. + /// describe each unique [CompilationUnitElementImpl]. /// /// This field contains the library URI of a unit. final List<_StringInfo> unitLibraryUris = []; /// The fields [unitLibraryUris] and [unitUnitUris] are used together to - /// describe each unique [CompilationUnitElement]. + /// describe each unique [CompilationUnitElementImpl]. /// /// This field contains the unit URI of a unit, which might be the same as /// the library URI for the defining unit, or a different one for a part. @@ -326,6 +321,9 @@ /// All subtypes declared in the unit. final List<_SubtypeInfo> subtypes = []; + /// All library fragment to library fragment references. + final List<_LibraryFragmentReference> libraryFragmentReferences = []; + /// The [_StringInfo] to use for `null` strings. late final _StringInfo nullString; @@ -333,13 +331,28 @@ nullString = _getStringInfo(_nullString); } - void addElementRelation(Element element, IndexRelationKind kind, int offset, + void addElementRelation(Element2 element, IndexRelationKind kind, int offset, int length, bool isQualified) { _ElementInfo elementInfo = _getElementInfo(element); elementRelations.add( _ElementRelationInfo(elementInfo, kind, offset, length, isQualified)); } + void addLibraryFragmentReference({ + required CompilationUnitElementImpl target, + required int uriOffset, + required int uriLength, + }) { + var targetId = _getUnitId(target); + libraryFragmentReferences.add( + _LibraryFragmentReference( + targetId: targetId, + uriOffset: uriOffset, + uriLength: uriLength, + ), + ); + } + void addNameRelation( String name, IndexRelationKind kind, int offset, bool isQualified) { _StringInfo nameId = _getStringInfo(name); @@ -347,21 +360,21 @@ } /// Adds a prefix (or empty string for unprefixed) for an element. - void addPrefixForElement(Element element, {PrefixElement? prefix}) { - if (element is MultiplyDefinedElementImpl || + void addPrefixForElement(Element2 element, {PrefixElement2? prefix}) { + if (element is MultiplyDefinedElementImpl2 || // TODO(brianwilkerson): The last two conditions are here because the // elements for `dynamic` and `Never` are singletons and hence don't have // a parent element for which we can find an `_ElementInfo`. This means // that any reference to either type via a prefix can't be stored in the // index. The solution is to make those elements be normal (not unique) // elements. - element is DynamicElementImpl || - element is NeverElementImpl) { + element is DynamicElementImpl2 || + element is NeverElementImpl2) { return; } _ElementInfo elementInfo = _getElementInfo(element); - elementInfo.importPrefixes.add(prefix?.name ?? ''); + elementInfo.importPrefixes.add(prefix?.name3 ?? ''); } void addSubtype(String name, List<String> members, List<String> supertypes) { @@ -421,63 +434,75 @@ return a.supertype.id - b.supertype.id; }); + // Sort library fragment references by targets. + libraryFragmentReferences.sortedBy<num>((reference) => reference.targetId); + return AnalysisDriverUnitIndexBuilder( - strings: stringInfoList.map((s) => s.value).toList(growable: false), - nullStringId: nullString.id, - unitLibraryUris: - unitLibraryUris.map((s) => s.id).toList(growable: false), - unitUnitUris: unitUnitUris.map((s) => s.id).toList(growable: false), - elementImportPrefixes: elementInfoList - .map((e) => e.importPrefixes.toList(growable: false).join(',')) - .toList(growable: false), - elementKinds: - elementInfoList.map((e) => e.kind).toList(growable: false), - elementUnits: - elementInfoList.map((e) => e.unitId).toList(growable: false), - elementNameUnitMemberIds: elementInfoList - .map((e) => e.nameIdUnitMember.id) - .toList(growable: false), - elementNameClassMemberIds: elementInfoList - .map((e) => e.nameIdClassMember.id) - .toList(growable: false), - elementNameParameterIds: elementInfoList - .map((e) => e.nameIdParameter.id) - .toList(growable: false), - usedElements: elementRelations - .map((r) => r.elementInfo.id) - .toList(growable: false), - usedElementKinds: - elementRelations.map((r) => r.kind).toList(growable: false), - usedElementOffsets: - elementRelations.map((r) => r.offset).toList(growable: false), - usedElementLengths: - elementRelations.map((r) => r.length).toList(growable: false), - usedElementIsQualifiedFlags: - elementRelations.map((r) => r.isQualified).toList(growable: false), - usedNames: - nameRelations.map((r) => r.nameInfo.id).toList(growable: false), - usedNameKinds: nameRelations.map((r) => r.kind).toList(growable: false), - usedNameOffsets: - nameRelations.map((r) => r.offset).toList(growable: false), - usedNameIsQualifiedFlags: - nameRelations.map((r) => r.isQualified).toList(growable: false), - supertypes: subtypes.map((subtype) => subtype.supertype.id).toList(growable: false), - subtypes: subtypes.map((subtype) { - return AnalysisDriverSubtypeBuilder( - name: subtype.name.id, - members: subtype.members - .map((member) => member.id) - .toList(growable: false), - ); - }).toList(growable: false)); + strings: stringInfoList.map((s) => s.value).toList(growable: false), + nullStringId: nullString.id, + unitLibraryUris: unitLibraryUris.map((s) => s.id).toList(growable: false), + unitUnitUris: unitUnitUris.map((s) => s.id).toList(growable: false), + elementImportPrefixes: elementInfoList + .map((e) => e.importPrefixes.toList(growable: false).join(',')) + .toList(growable: false), + elementKinds: elementInfoList.map((e) => e.kind).toList(growable: false), + elementUnits: + elementInfoList.map((e) => e.unitId).toList(growable: false), + elementNameUnitMemberIds: elementInfoList + .map((e) => e.nameIdUnitMember.id) + .toList(growable: false), + elementNameClassMemberIds: elementInfoList + .map((e) => e.nameIdClassMember.id) + .toList(growable: false), + elementNameParameterIds: elementInfoList + .map((e) => e.nameIdParameter.id) + .toList(growable: false), + usedElements: + elementRelations.map((r) => r.elementInfo.id).toList(growable: false), + usedElementKinds: + elementRelations.map((r) => r.kind).toList(growable: false), + usedElementOffsets: + elementRelations.map((r) => r.offset).toList(growable: false), + usedElementLengths: + elementRelations.map((r) => r.length).toList(growable: false), + usedElementIsQualifiedFlags: + elementRelations.map((r) => r.isQualified).toList(growable: false), + usedNames: + nameRelations.map((r) => r.nameInfo.id).toList(growable: false), + usedNameKinds: nameRelations.map((r) => r.kind).toList(growable: false), + usedNameOffsets: + nameRelations.map((r) => r.offset).toList(growable: false), + usedNameIsQualifiedFlags: + nameRelations.map((r) => r.isQualified).toList(growable: false), + supertypes: subtypes + .map((subtype) => subtype.supertype.id) + .toList(growable: false), + subtypes: subtypes.map((subtype) { + return AnalysisDriverSubtypeBuilder( + name: subtype.name.id, + members: subtype.members + .map((member) => member.id) + .toList(growable: false), + ); + }).toList(growable: false), + libFragmentRefTargets: libraryFragmentReferences + .map((r) => r.targetId) + .toList(growable: false), + libFragmentRefUriOffsets: libraryFragmentReferences + .map((r) => r.uriOffset) + .toList(growable: false), + libFragmentRefUriLengths: libraryFragmentReferences + .map((r) => r.uriLength) + .toList(growable: false), + ); } /// Return the unique [_ElementInfo] corresponding the [element]. The field /// [_ElementInfo.id] is filled by [assemble] during final sorting. - _ElementInfo _getElementInfo(Element element) { - element = element.declaration!; + _ElementInfo _getElementInfo(Element2 element) { + element = element.baseElement; return elementMap.putIfAbsent(element, () { - CompilationUnitElement unitElement = getUnitElement(element); + var unitElement = getUnitElement(element); int unitId = _getUnitId(unitElement); return _newElementInfo(unitId, element); }); @@ -498,7 +523,7 @@ /// Add information about [unitElement] to [unitUnitUris] and /// [unitLibraryUris] if necessary, and return the location in those /// arrays representing [unitElement]. - int _getUnitId(CompilationUnitElement unitElement) { + int _getUnitId(CompilationUnitElementImpl unitElement) { return unitMap.putIfAbsent(unitElement, () { assert(unitLibraryUris.length == unitUnitUris.length); int id = unitUnitUris.length; @@ -517,7 +542,7 @@ /// Return a new [_ElementInfo] for the given [element] in the given [unitId]. /// This method is static, so it cannot add any information to the index. - _ElementInfo _newElementInfo(int unitId, Element element) { + _ElementInfo _newElementInfo(int unitId, Element2 element) { IndexElementInfo info = IndexElementInfo(element); element = info.element; @@ -538,8 +563,8 @@ _IndexContributor(this.assembler); - void recordIsAncestorOf(InterfaceElement descendant) { - _recordIsAncestorOf(descendant, descendant, false, <InterfaceElement>[]); + void recordIsAncestorOf(InterfaceElement2 descendant) { + _recordIsAncestorOf(descendant, descendant, false, <InterfaceElement2>[]); } /// Record that the name [node] has a relation of the given [kind]. @@ -548,8 +573,8 @@ assembler.addNameRelation(node.name, kind, node.offset, isQualified); } - /// Record reference to the given operator [Element]. - void recordOperatorReference(Token operator, Element? element) { + /// Record reference to the given operator [Element2]. + void recordOperatorReference(Token operator, Element2? element) { recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); } @@ -557,7 +582,7 @@ /// of the given [node]. The flag [isQualified] is `true` if [node] has an /// explicit or implicit qualifier, so cannot be shadowed by a local /// declaration. - void recordRelation(Element? element, IndexRelationKind kind, + void recordRelation(Element2? element, IndexRelationKind kind, SyntacticEntity node, bool isQualified) { if (element != null) { recordRelationOffset( @@ -569,7 +594,7 @@ /// [offset] and [length]. The flag [isQualified] is `true` if the relation /// has an explicit or implicit qualifier, so [element] cannot be shadowed by /// a local declaration. - void recordRelationOffset(Element? element, IndexRelationKind kind, + void recordRelationOffset(Element2? element, IndexRelationKind kind, int offset, int length, bool isQualified) { if (element == null) return; @@ -583,15 +608,14 @@ elementKind == ElementKind.PREFIX || elementKind == ElementKind.TYPE_PARAMETER || elementKind == ElementKind.FUNCTION && - element is FunctionElement && - element.enclosingElement3 is ExecutableElement || - false) { + element is LocalFunctionElement) { return; } // Ignore named parameters of synthetic functions, e.g. created for LUB. // These functions are not bound to a source, we cannot index them. - if (elementKind == ElementKind.PARAMETER && element is ParameterElement) { - var enclosingElement = element.enclosingElement3; + if (elementKind == ElementKind.PARAMETER && + element is FormalParameterElement) { + var enclosingElement = element.enclosingElement2; if (enclosingElement == null || enclosingElement.isSynthetic) { return; } @@ -600,8 +624,8 @@ // units, but don't have names. So, we cannot index references to their // named parameters. Ignore them. if (elementKind == ElementKind.PARAMETER && - element is ParameterElement && - element.enclosingElement3 is GenericFunctionTypeElement) { + element is FormalParameterElement && + element.enclosingElement2 is GenericFunctionTypeElement2) { return; } // Add the relation. @@ -611,7 +635,7 @@ /// Record that [element] has a relation of the given [kind] at the location /// of the given [token]. void recordRelationToken( - Element? element, + Element2? element, IndexRelationKind kind, Token token, { bool isQualified = true, @@ -620,35 +644,35 @@ element, kind, token.offset, token.length, isQualified); } - /// Record a relation between a super [namedType] and its [Element]. + /// Record a relation between a super [namedType] and its [Element2]. void recordSuperType(NamedType namedType, IndexRelationKind kind) { var isQualified = namedType.importPrefix != null; - var element = namedType.element; + var element = namedType.element2; recordRelation(element, kind, namedType.name2, isQualified); } - void recordUriReference(Element? element, StringLiteral uri) { + void recordUriReference(Element2? element, StringLiteral uri) { recordRelation(element, IndexRelationKind.IS_REFERENCED_BY, uri, true); } @override void visitAssignmentExpression(AssignmentExpression node) { - recordOperatorReference(node.operator, node.staticElement); + recordOperatorReference(node.operator, node.element); super.visitAssignmentExpression(node); } @override void visitBinaryExpression(BinaryExpression node) { - recordOperatorReference(node.operator, node.staticElement); + recordOperatorReference(node.operator, node.element); super.visitBinaryExpression(node); } @override void visitClassDeclaration(ClassDeclaration node) { _addSubtypeForClassDeclaration(node); - var declaredElement = node.declaredElement!; + var declaredElement = node.declaredFragment!.element; if (node.extendsClause == null) { - var objectElement = declaredElement.supertype?.element; + var objectElement = declaredElement.supertype?.element3; recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY, node.name.offset, 0, true); } @@ -657,11 +681,11 @@ // If the class has only a synthetic default constructor, then it // implicitly invokes the default super constructor. Associate the // invocation with the name of the class. - var defaultConstructor = declaredElement.constructors.singleOrNull; - if (defaultConstructor is ConstructorElementImpl && + var defaultConstructor = declaredElement.constructors2.singleOrNull; + if (defaultConstructor is ConstructorElementImpl2 && defaultConstructor.isSynthetic) { defaultConstructor.isDefaultConstructor; - var superConstructor = defaultConstructor.superConstructor; + var superConstructor = defaultConstructor.superConstructor2; if (superConstructor != null) { recordRelation( superConstructor, IndexRelationKind.IS_INVOKED_BY, node.name, true); @@ -674,7 +698,7 @@ @override void visitClassTypeAlias(ClassTypeAlias node) { _addSubtypeForClassTypeAlis(node); - recordIsAncestorOf(node.declaredElement!); + recordIsAncestorOf(node.declaredFragment!.element); recordSuperType(node.superclass, IndexRelationKind.IS_EXTENDED_BY); super.visitClassTypeAlias(node); } @@ -683,8 +707,8 @@ visitCommentReference(CommentReference node) { var expression = node.expression; if (expression is Identifier) { - var element = expression.staticElement; - if (element is ConstructorElement) { + var element = expression.element; + if (element is ConstructorElement2) { if (expression is PrefixedIdentifier) { var offset = expression.prefix.end; var length = expression.end - offset; @@ -709,12 +733,12 @@ } @override - visitConstructorDeclaration(ConstructorDeclaration node) { + visitConstructorDeclaration(covariant ConstructorDeclarationImpl node) { // If the constructor does not have an explicit `super` constructor // invocation, it implicitly invokes the unnamed constructor. if (node.initializers.none((e) => e is SuperConstructorInvocation)) { - var element = node.declaredElement as ConstructorElementImpl; - var superConstructor = element.superConstructor; + var element = node.declaredFragment!.element; + var superConstructor = element.superConstructor2; if (superConstructor != null) { var offset = node.returnType.offset; var end = (node.name ?? node.returnType).end; @@ -729,14 +753,14 @@ @override void visitConstructorFieldInitializer(ConstructorFieldInitializer node) { var fieldName = node.fieldName; - var element = fieldName.staticElement; + var element = fieldName.element; recordRelation(element, IndexRelationKind.IS_WRITTEN_BY, fieldName, true); node.expression.accept(this); } @override void visitConstructorName(ConstructorName node) { - var element = node.staticElement?.declaration; + var element = node.element?.baseElement; element = _getActualConstructorElement(element); IndexRelationKind kind; @@ -765,7 +789,7 @@ @override void visitEnumConstantDeclaration(EnumConstantDeclaration node) { - var constructorElement = node.constructorElement; + var constructorElement = node.constructorElement2; if (constructorElement != null) { int offset; int length; @@ -800,21 +824,21 @@ memberNodes: node.members, ); - var declaredElement = node.declaredElement!; + var declaredElement = node.declaredFragment!.element; recordIsAncestorOf(declaredElement); super.visitEnumDeclaration(node); } @override void visitExportDirective(ExportDirective node) { - var element = node.element; - recordUriReference(element?.exportedLibrary, node.uri); + var element = node.libraryExport; + recordUriReference(element?.exportedLibrary2, node.uri); super.visitExportDirective(node); } @override void visitExpression(Expression node) { - ParameterElement? parameterElement = node.staticParameterElement; + var parameterElement = node.correspondingParameter; if (parameterElement != null && parameterElement.isOptionalPositional) { recordRelationOffset(parameterElement, IndexRelationKind.IS_REFERENCED_BY, node.offset, 0, true); @@ -833,7 +857,7 @@ _recordImportPrefixedElement( importPrefix: node.importPrefix, name: node.name, - element: node.element, + element: node.element2, ); node.typeArguments?.accept(this); @@ -848,20 +872,18 @@ memberNodes: node.members, ); - var declaredElement = node.declaredElement!; + var declaredElement = node.declaredFragment!.element; recordIsAncestorOf(declaredElement); super.visitExtensionTypeDeclaration(node); } @override - visitFieldFormalParameter(FieldFormalParameter node) { - var element = node.declaredElement; - if (element is FieldFormalParameterElement) { - var field = element.field; - if (field != null) { - recordRelation(field, IndexRelationKind.IS_WRITTEN_BY, node.name, true); - } + visitFieldFormalParameter(covariant FieldFormalParameterImpl node) { + var element = node.declaredFragment!.element; + var field = element.field2; + if (field != null) { + recordRelation(field, IndexRelationKind.IS_WRITTEN_BY, node.name, true); } return super.visitFieldFormalParameter(node); @@ -877,15 +899,15 @@ @override void visitImportDirective(ImportDirective node) { - var element = node.element; - recordUriReference(element?.importedLibrary, node.uri); + var element = node.libraryImport; + recordUriReference(element?.importedLibrary2, node.uri); super.visitImportDirective(node); } @override void visitIndexExpression(IndexExpression node) { - Element? element = node.writeOrReadElement; - if (element is MethodElement) { + var element = node.writeOrReadElement2; + if (element is MethodElement2) { Token operator = node.leftBracket; recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator); } @@ -898,14 +920,14 @@ @override void visitMethodInvocation(MethodInvocation node) { SimpleIdentifier name = node.methodName; - Element? element = name.staticElement; + var element = name.element; // unresolved name invocation bool isQualified = node.realTarget != null; if (element == null) { recordNameRelation(name, IndexRelationKind.IS_INVOKED_BY, isQualified); } // element invocation - IndexRelationKind kind = element is InterfaceElement + IndexRelationKind kind = element is InterfaceElement2 ? IndexRelationKind.IS_REFERENCED_BY : IndexRelationKind.IS_INVOKED_BY; recordRelation(element, kind, name, isQualified); @@ -917,7 +939,7 @@ @override void visitMixinDeclaration(MixinDeclaration node) { _addSubtypeForMixinDeclaration(node); - recordIsAncestorOf(node.declaredElement!); + recordIsAncestorOf(node.declaredFragment!.element); super.visitMixinDeclaration(node); } @@ -934,21 +956,24 @@ _recordImportPrefixedElement( importPrefix: node.importPrefix, name: node.name2, - element: node.element, + element: node.element2, ); node.typeArguments?.accept(this); } @override - void visitPartDirective(PartDirective node) { - var partElement = node.element; - if (partElement is PartElement) { - var partElementUri = partElement.uri; - if (partElementUri is DirectiveUriWithUnit) { - recordUriReference(partElementUri.unit, node.uri); + void visitPartDirective(covariant PartDirectiveImpl node) { + if (node.partInclude case var partInclude?) { + if (partInclude.includedFragment case var includedFragment?) { + assembler.addLibraryFragmentReference( + target: includedFragment, + uriOffset: node.uri.offset, + uriLength: node.uri.length, + ); } } + super.visitPartDirective(node); } @@ -966,7 +991,7 @@ offset = nameNode.offset; length = 0; } - recordRelationOffset(node.element, IndexRelationKind.IS_REFERENCED_BY, + recordRelationOffset(node.element2, IndexRelationKind.IS_REFERENCED_BY, offset, length, true); } return super.visitPatternField(node); @@ -974,15 +999,15 @@ @override void visitPostfixExpression(PostfixExpression node) { - recordOperatorReference(node.operator, node.staticElement); + recordOperatorReference(node.operator, node.element); super.visitPostfixExpression(node); } @override void visitPrefixedIdentifier(PrefixedIdentifier node) { - var element = node.staticElement; - var prefixElement = node.prefix.staticElement; - if (element != null && prefixElement is PrefixElement) { + var element = node.element; + var prefixElement = node.prefix.element; + if (element != null && prefixElement is PrefixElement2) { assembler.addPrefixForElement(element, prefix: prefixElement); } super.visitPrefixedIdentifier(node); @@ -990,14 +1015,14 @@ @override void visitPrefixExpression(PrefixExpression node) { - recordOperatorReference(node.operator, node.staticElement); + recordOperatorReference(node.operator, node.element); super.visitPrefixExpression(node); } @override void visitRedirectingConstructorInvocation( RedirectingConstructorInvocation node) { - var element = node.staticElement; + var element = node.element; if (node.constructorName != null) { int offset = node.period!.offset; int length = node.constructorName!.end - offset; @@ -1018,14 +1043,14 @@ return; } - Element? element = node.writeOrReadElement; - if (element is ParameterElement) { + var element = node.writeOrReadElement2; + if (element is FormalParameterElementImpl) { element = declaredParameterElement(node, element); } var parent = node.parent; if (element != null && - element.enclosingElement3 is CompilationUnitElement && + element.firstFragment.enclosingFragment is CompilationUnitElementImpl && // We're only unprefixed when part of a PrefixedIdentifier if we're // the left side. (parent is! PrefixedIdentifier || parent.prefix == node)) { @@ -1048,7 +1073,7 @@ recordNameRelation(node, kind, isQualified); } // ignore a local reference to a parameter - if (element is ParameterElement && node.parent is! Label) { + if (element is FormalParameterElement && node.parent is! Label) { return; } // record specific relations @@ -1058,7 +1083,7 @@ @override void visitSuperConstructorInvocation(SuperConstructorInvocation node) { - var element = node.staticElement; + var element = node.element; if (node.constructorName != null) { int offset = node.period!.offset; int length = node.constructorName!.end - offset; @@ -1074,9 +1099,9 @@ @override visitSuperFormalParameter(SuperFormalParameter node) { - var element = node.declaredElement; - if (element is SuperFormalParameterElementImpl) { - var superParameter = element.superConstructorParameter; + var element = node.declaredFragment!.element; + if (element is SuperFormalParameterElementImpl2) { + var superParameter = element.superConstructorParameter2; if (superParameter != null) { recordRelation(superParameter, IndexRelationKind.IS_REFERENCED_BY, node.name, true); @@ -1104,14 +1129,16 @@ List<String> supertypes = []; List<String> members = []; - String getInterfaceElementId(InterfaceElement element) { - return '${element.library.source.uri};' - '${element.source.uri};${element.name}'; + String getInterfaceElementId(InterfaceElement2 element) { + var libraryUri = element.library2.uri; + var libraryFragment = element.firstFragment.libraryFragment; + var libraryFragmentUri = libraryFragment.source.uri; + return '$libraryUri;$libraryFragmentUri;${element.name3}'; } void addSupertype(NamedType? type) { - var element = type?.element; - if (element is InterfaceElement) { + var element = type?.element2; + if (element is InterfaceElement2) { String id = getInterfaceElementId(element); supertypes.add(id); } @@ -1174,17 +1201,17 @@ /// If the given [constructor] is a synthetic constructor created for a /// [ClassTypeAlias], return the actual constructor of a [ClassDeclaration] /// which is invoked. Return `null` if a redirection cycle is detected. - ConstructorElement? _getActualConstructorElement( - ConstructorElement? constructor) { - var seenConstructors = <ConstructorElement?>{}; - while (constructor is ConstructorElementImpl && constructor.isSynthetic) { - var enclosing = constructor.enclosingElement3; - if (enclosing is ClassElementImpl && enclosing.isMixinApplication) { - var superInvocation = constructor.constantInitializers + ConstructorElement2? _getActualConstructorElement( + ConstructorElement2? constructor) { + var seenConstructors = <ConstructorElement2?>{}; + while (constructor is ConstructorElementImpl2 && constructor.isSynthetic) { + var enclosing = constructor.enclosingElement2; + if (enclosing is ClassElementImpl2 && enclosing.isMixinApplication) { + var superInvocation = constructor.firstFragment.constantInitializers .whereType<SuperConstructorInvocation>() .singleOrNull; if (superInvocation != null) { - constructor = superInvocation.staticElement; + constructor = superInvocation.element; } } else { break; @@ -1210,17 +1237,17 @@ void _recordImportPrefixedElement({ required ImportPrefixReference? importPrefix, required Token name, - required Element? element, + required Element2? element, }) { if (element == null) { return; } if (importPrefix != null) { - var prefixElement = importPrefix.element; - if (prefixElement is PrefixElement) { + var prefixElement = importPrefix.element2; + if (prefixElement is PrefixElement2) { recordRelationToken( - importPrefix.element, + importPrefix.element2, IndexRelationKind.IS_REFERENCED_BY, importPrefix.name, isQualified: false, @@ -1239,40 +1266,55 @@ ); } - void _recordIsAncestorOf(Element descendant, InterfaceElement ancestor, - bool includeThis, List<InterfaceElement> visitedElements) { + void _recordIsAncestorOf(Element2 descendant, InterfaceElement2 ancestor, + bool includeThis, List<InterfaceElement2> visitedElements) { if (visitedElements.contains(ancestor)) { return; } visitedElements.add(ancestor); if (includeThis) { - int offset = descendant.nameOffset; - int length = descendant.nameLength; - assembler.addElementRelation( - ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false); + var offset = descendant.firstFragment.nameOffset2; + var length = descendant.name3?.length; + if (offset != null && length != null) { + assembler.addElementRelation( + ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false); + } } { var superType = ancestor.supertype; if (superType != null) { _recordIsAncestorOf( - descendant, superType.element, true, visitedElements); + descendant, superType.element3, true, visitedElements); } } for (InterfaceType mixinType in ancestor.mixins) { - _recordIsAncestorOf(descendant, mixinType.element, true, visitedElements); + _recordIsAncestorOf( + descendant, mixinType.element3, true, visitedElements); } - if (ancestor is MixinElement) { + if (ancestor is MixinElement2) { for (InterfaceType type in ancestor.superclassConstraints) { - _recordIsAncestorOf(descendant, type.element, true, visitedElements); + _recordIsAncestorOf(descendant, type.element3, true, visitedElements); } } for (InterfaceType implementedType in ancestor.interfaces) { _recordIsAncestorOf( - descendant, implementedType.element, true, visitedElements); + descendant, implementedType.element3, true, visitedElements); } } } +class _LibraryFragmentReference { + final int targetId; + final int uriOffset; + final int uriLength; + + _LibraryFragmentReference({ + required this.targetId, + required this.uriOffset, + required this.uriLength, + }); +} + /// Information about a single name relation in single compilation unit. class _NameRelationInfo { final _StringInfo nameInfo; @@ -1308,3 +1350,31 @@ _SubtypeInfo(this.supertype, this.name, this.members); } + +extension AnalysisDriverUnitIndexExtension on AnalysisDriverUnitIndex { + int getLibraryFragmentId(CompilationUnitElementImpl fragment) { + var libraryUriId = getUriId(fragment.element.uri); + var unitUriId = getUriId(fragment.source.uri); + for (var i = 0; i < unitLibraryUris.length; i++) { + if (unitLibraryUris[i] == libraryUriId && unitUnitUris[i] == unitUriId) { + return i; + } + } + return -1; + } + + /// Returns the identifier of [str], or `-1` if not used. + int getStringId(String? str) { + if (str == null) { + return nullStringId; + } + + return binarySearch(strings, str); + } + + /// Returns the identifier of the [uri], or `-1` if not used. + int getUriId(Uri uri) { + var str = uri.toString(); + return getStringId(str); + } +}
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart index cf66ebd..8cc7036 100644 --- a/pkg/analyzer/lib/src/dart/analysis/search.dart +++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -381,7 +381,7 @@ return _searchReferences(element, searchedFiles); } else if (element is ConstructorElement) { return await _searchReferences_Constructor(element, searchedFiles); - } else if (element is CompilationUnitElement) { + } else if (element is CompilationUnitElementImpl) { return _searchReferences_CompilationUnit(element); } else if (element is PropertyAccessorElement && element.isGetter) { return _searchReferences_Getter(element, searchedFiles); @@ -692,7 +692,7 @@ } Future<List<SearchResult>> _searchReferences_CompilationUnit( - CompilationUnitElement element) async { + CompilationUnitElementImpl element) async { String path = element.source.fullName; var file = _driver.resourceProvider.getFile(path); @@ -704,8 +704,28 @@ } // Check files that reference the given file. - List<SearchResult> results = <SearchResult>[]; + var results = <SearchResult>[]; for (var reference in fileState.referencingFiles) { + var index = await _driver.getIndex(reference.path); + if (index != null) { + var targetId = index.getLibraryFragmentId(element); + for (var i = 0; i < index.libFragmentRefTargets.length; i++) { + if (index.libFragmentRefTargets[i] == targetId) { + var refUnit = await _getUnitElement(reference.path); + results.add( + SearchResult._( + refUnit!, + SearchResultKind.REFERENCE, + index.libFragmentRefUriOffsets[i], + index.libFragmentRefUriLengths[i], + true, + true, + ), + ); + } + } + } + await _addResultsInFile( results, element, @@ -1391,7 +1411,7 @@ void addSubtypes( String superIdString, List<SubtypeResult> results, FileState file) { - var superId = getStringId(superIdString); + var superId = index.getStringId(superIdString); if (superId == -1) { return; } @@ -1425,24 +1445,24 @@ /// Return the [element]'s identifier in the [index] or `-1` if the /// [element] is not referenced in the [index]. int findElementId(Element element) { - IndexElementInfo info = IndexElementInfo(element); - element = info.element; + IndexElementInfo info = IndexElementInfo(element.asElement2!); + element = info.element.asElement!; // Find the id of the element's unit. int unitId = getUnitId(element); if (unitId == -1) { return -1; } // Prepare information about the element. - var components = ElementNameComponents(element); - int unitMemberId = getStringId(components.unitMemberName); + var components = ElementNameComponents(element.asElement2!); + int unitMemberId = index.getStringId(components.unitMemberName); if (unitMemberId == -1) { return -1; } - int classMemberId = getStringId(components.classMemberName); + int classMemberId = index.getStringId(components.classMemberName); if (classMemberId == -1) { return -1; } - int parameterId = getStringId(components.parameterName); + int parameterId = index.getStringId(components.parameterName); if (parameterId == -1) { return -1; } @@ -1511,35 +1531,11 @@ return results; } - /// Return the identifier of [str] in the [index] or `-1` if [str] is not - /// used in the [index]. - int getStringId(String? str) { - if (str == null) { - return index.nullStringId; - } - - return binarySearch(index.strings, str); - } - /// Return the identifier of the [CompilationUnitElement] containing the /// [element] in the [index] or `-1` if not found. int getUnitId(Element element) { - CompilationUnitElement unitElement = getUnitElement(element); - int libraryUriId = getUriId(unitElement.library.source.uri); - if (libraryUriId == -1) { - return -1; - } - int unitUriId = getUriId(unitElement.source.uri); - if (unitUriId == -1) { - return -1; - } - for (int i = 0; i < index.unitLibraryUris.length; i++) { - if (index.unitLibraryUris[i] == libraryUriId && - index.unitUnitUris[i] == unitUriId) { - return i; - } - } - return -1; + var unitElement = getUnitElement(element.asElement2!); + return index.getLibraryFragmentId(unitElement); } /// Return a list of results where a class members with the given [name] is @@ -1550,7 +1546,7 @@ Future<CompilationUnitElement?> Function() getEnclosingUnitElement) async { // Find the name identifier. - int nameId = getStringId(name); + int nameId = index.getStringId(name); if (nameId == -1) { return const <SearchResult>[]; } @@ -1582,13 +1578,6 @@ return results; } - /// Return the identifier of the [uri] in the [index] or `-1` if the [uri] is - /// not used in the [index]. - int getUriId(Uri uri) { - String str = uri.toString(); - return getStringId(str); - } - /// Return the index of the first occurrence of the [value] in the /// [sortedList], or `-1` if the [value] is not in the list. int _findFirstOccurrence(List<int> sortedList, int value) {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart index b95f4f0..6e06dda 100644 --- a/pkg/analyzer/lib/src/dart/ast/ast.dart +++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5025,6 +5025,11 @@ @experimental BindPatternVariableElement2? get declaredElement2; + /// The fragment declared by this declaration. + /// + /// Returns `null` if the AST structure hasn't been resolved. + BindPatternVariableFragment? get declaredFragment; + /// The `var` or `final` keyword. Token? get keyword; @@ -5062,6 +5067,9 @@ } @override + BindPatternVariableElementImpl? get declaredFragment => declaredElement; + + @override Token get endToken => name; /// The `final` keyword, or `null` if the `final` keyword isn't used. @@ -5686,7 +5694,7 @@ final EnumConstantArgumentsImpl? arguments; @override - ConstructorElement? constructorElement; + ConstructorElementMixin? constructorElement; /// Initializes a newly created enum constant declaration. /// @@ -5704,10 +5712,10 @@ @experimental @override - ConstructorElement2? get constructorElement2 => + ConstructorElementMixin2? get constructorElement2 => constructorElement?.asElement2; - set constructorElement2(ConstructorElement2? value) { + set constructorElement2(ConstructorElementMixin2? value) { constructorElement = value?.asElement; } @@ -9093,6 +9101,11 @@ /// [ normalParameterTypes ,? ] @AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart') abstract final class GenericFunctionType implements TypeAnnotation { + /// The fragment declared by this declaration. + /// + /// Returns `null` if the AST structure hasn't been resolved. + GenericFunctionTypeFragment? get declaredFragment; + /// The `Function` keyword. Token get functionKeyword; @@ -9148,6 +9161,7 @@ @override Token get beginToken => _returnType?.beginToken ?? functionKeyword; + @override GenericFunctionTypeElementImpl? get declaredFragment { return declaredElement; } @@ -10860,10 +10874,10 @@ TypeArgumentListImpl? _typeArguments; @override - List<DartType>? typeArgumentTypes; + List<TypeImpl>? typeArgumentTypes; @override - DartType? staticInvokeType; + TypeImpl? staticInvokeType; /// Initializes a newly created invocation. InvocationExpressionImpl({ @@ -10988,6 +11002,11 @@ /// The colon that separates the label from the statement. Token get colon; + /// The fragment declared by this declaration. + /// + /// Returns `null` if the AST structure hasn't been resolved. + LabelFragment? get declaredFragment; + /// The label being associated with the statement. SimpleIdentifier get label; } @@ -11077,6 +11096,10 @@ Token get beginToken => _label.beginToken; @override + LabelElementImpl? get declaredFragment => + (label.element as LabelElementImpl2?)?.firstFragment; + + @override Token get endToken => colon; @override @@ -13812,7 +13835,7 @@ @experimental @override - PartInclude? get partInclude => element as PartInclude?; + PartElementImpl? get partInclude => element; @override ChildEntities get _childEntities => super._childEntities
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart index aea2c42..dfd4c7d 100644 --- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart +++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -130,7 +130,7 @@ } @override - void visitConstantPattern(ConstantPattern node) { + void visitConstantPattern(covariant ConstantPatternImpl node) { var expression = node.expression.unParenthesized; if (expression.typeOrThrow is InvalidType) { return; @@ -517,7 +517,7 @@ /// Returns `false` if we can prove that `constant == value` always returns /// `false`, taking into account the fact that [constantType] has primitive /// equality. - bool _canBeEqual(DartType constantType, DartType valueType) { + bool _canBeEqual(TypeImpl constantType, TypeImpl valueType) { if (constantType is InterfaceType) { if (valueType is InterfaceTypeImpl) { if (constantType.isDartCoreInt && valueType.isDartCoreDouble) { @@ -776,7 +776,7 @@ /// Check if the object [obj] matches the type [type] according to runtime /// type checking rules. - bool _runtimeTypeMatch(DartObjectImpl obj, DartType type) { + bool _runtimeTypeMatch(DartObjectImpl obj, TypeImpl type) { return _currentLibrary.typeSystem.runtimeTypeMatch(obj, type); }
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index e1016ce..056ea78 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -2910,7 +2910,8 @@ if (baseParameter.isInitializingFormal) { var field = (parameter as FieldFormalParameterElement).field; if (field != null) { - var fieldType = field.type; + // TODO(scheglov): eliminate this cast + var fieldType = field.type as TypeImpl; if (fieldType != parameter.type) { // We've already checked that the argument can be assigned to the // parameter; we also need to check that it can be assigned to @@ -3192,7 +3193,7 @@ /// type-checking rules. bool runtimeTypeMatch( DartObjectImpl obj, - DartType type, + TypeImpl type, ) { type = type.extensionTypeErasure; var objType = obj.type;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index 2501c83..36d1372 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1808,6 +1808,9 @@ ConstructorElementImpl2 get baseElement; @override + InterfaceElementImpl2 get enclosingElement2; + + @override InterfaceTypeImpl get returnType; } @@ -1974,10 +1977,9 @@ return null; } + // TODO(scheglov): eliminate this cast + superDefault as DartObjectImpl; var superDefaultType = superDefault.type; - if (superDefaultType == null) { - return null; - } var typeSystem = library?.typeSystem; if (typeSystem == null) { @@ -2079,7 +2081,7 @@ }); @override - LibraryFragment get libraryFragment => unit; + CompilationUnitElementImpl get libraryFragment => unit; @override Source get source => unit.source; @@ -3745,12 +3747,12 @@ } @override - List<FieldElement> get constants { + List<FieldElementOrMember> get constants { return fields.where((field) => field.isEnumConstant).toList(); } @override - List<FieldElement2> get constants2 => + List<FieldElement2OrMember> get constants2 => constants.map((e) => e.asElement2).toList(); @override @@ -4328,7 +4330,7 @@ ConstructorElement2 get primaryConstructor2 => primaryConstructor.element; @override - FieldElement2 get representation2 => representation.asElement2; + FieldElement2OrMember get representation2 => representation.asElement2; @override T? accept2<T>(ElementVisitor2<T> visitor) { @@ -4489,7 +4491,7 @@ } @override - GetterElement? get getter2 => firstFragment.getter?.element as GetterElement?; + GetterElementImpl? get getter2 => firstFragment.getter?.element; @override bool get hasImplicitType => firstFragment.hasImplicitType; @@ -4533,7 +4535,7 @@ String? get name3 => firstFragment.name2; @override - SetterElement? get setter2 => firstFragment.setter?.element as SetterElement?; + SetterElementImpl? get setter2 => firstFragment.setter?.element; @override TypeImpl get type => firstFragment.type; @@ -4611,8 +4613,9 @@ FieldFormalParameterElementImpl2(super.firstFragment); @override - FieldElement2? get field2 => switch (firstFragment) { - FieldFormalParameterElementImpl(:FieldFragment field) => field.element, + FieldElementImpl2? get field2 => switch (firstFragment) { + FieldFormalParameterElementImpl(:FieldElementImpl field) => + field.element, _ => null, }; @@ -5940,11 +5943,11 @@ InstanceElementImpl get firstFragment; @override - List<GetterElement> get getters2 { + List<GetterElement2OrMember> get getters2 { _readMembers(); return accessors .where((e) => e.isGetter) - .map((e) => e.asElement2 as GetterElement?) + .map((e) => e.asElement2 as GetterElement2OrMember) .nonNulls .toList(); } @@ -6484,7 +6487,7 @@ } @override - PropertyAccessorElement? getSetter(String setterName) { + PropertyAccessorElementOrMember? getSetter(String setterName) { return getSetterFromAccessors(setterName, accessors); } @@ -6708,8 +6711,8 @@ } } - static PropertyAccessorElement? getSetterFromAccessors( - String setterName, List<PropertyAccessorElement> accessors) { + static PropertyAccessorElementOrMember? getSetterFromAccessors( + String setterName, List<PropertyAccessorElementOrMember> accessors) { // Do we need the check for isSetter below? if (!setterName.endsWith('=')) { setterName += '='; @@ -7432,8 +7435,7 @@ } @override - LibraryFragment get firstFragment => - definingCompilationUnit as LibraryFragment; + CompilationUnitElementImpl get firstFragment => definingCompilationUnit; @override List<CompilationUnitElementImpl> get fragments { @@ -7444,12 +7446,12 @@ } @override - List<GetterElement> get getters { - var declarations = <GetterElement>{}; + List<GetterElement2OrMember> get getters { + var declarations = <GetterElement2OrMember>{}; for (var unit in units) { declarations.addAll(unit._accessors .where((accessor) => accessor.isGetter) - .map((accessor) => (accessor as GetterFragment).element)); + .map((accessor) => accessor.element as GetterElement2OrMember)); } return declarations.toList(); } @@ -9856,8 +9858,8 @@ String get identifier => 'part'; @override - LibraryFragment? get includedFragment { - if (uri case DirectiveUriWithUnit uri) { + CompilationUnitElementImpl? get includedFragment { + if (uri case DirectiveUriWithUnitImpl uri) { return uri.libraryFragment; } return null; @@ -9867,7 +9869,7 @@ ElementKind get kind => ElementKind.PART; @override - LibraryFragment get libraryFragment => enclosingUnit; + CompilationUnitElementImpl get libraryFragment => enclosingUnit; @override T? accept<T>(ElementVisitor<T> visitor) => visitor.visitPartElement(this); @@ -10442,7 +10444,13 @@ /// Common base class for all analyzer-internal classes that implement /// [PropertyInducingElement2]. abstract class PropertyInducingElement2OrMember - implements VariableElement2OrMember, PropertyInducingElement2 {} + implements VariableElement2OrMember, PropertyInducingElement2 { + @override + GetterElement2OrMember? get getter2; + + @override + SetterElement2OrMember? get setter2; +} /// A concrete implementation of a [PropertyInducingElement]. abstract class PropertyInducingElementImpl @@ -10937,7 +10945,7 @@ } @override - FormalParameterElement? get superConstructorParameter2 { + FormalParameterElementMixin? get superConstructorParameter2 { return firstFragment.superConstructorParameter?.asElement2; } @@ -11098,7 +11106,8 @@ } @override - GetterElement? get getter2 => firstFragment.getter2?.element; + GetterElementImpl? get getter2 => + firstFragment.getter2?.element as GetterElementImpl?; @override bool get hasImplicitType => firstFragment.hasImplicitType; @@ -11130,7 +11139,8 @@ String? get name3 => firstFragment.name2; @override - SetterElement? get setter2 => firstFragment.setter2?.element; + SetterElementImpl? get setter2 => + firstFragment.setter2?.element as SetterElementImpl?; @override TypeImpl get type => firstFragment.type;
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart index d277536..93dd7ee 100644 --- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart +++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -399,7 +399,7 @@ void _checkArgumentsNotMatchingBounds({ required SyntacticEntity? errorEntity, required ErrorReporter? errorReporter, - required List<DartType> typeArguments, + required List<TypeImpl> typeArguments, }) { for (int i = 0; i < _typeFormals.length; i++) { var parameter = _typeFormals[i];
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart index 7a0a97b..01d4535 100644 --- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart +++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -83,16 +83,14 @@ /// not `null`, add a new [Conflict] to it. ExecutableElementOrMember? combineSignatures({ required InterfaceElement targetClass, - required List<ExecutableElement> candidates, + required List<ExecutableElementOrMember> candidates, required bool doTopMerge, required Name name, List<Conflict>? conflicts, }) { // If just one candidate, it is always valid. if (candidates.length == 1) { - // TODO(paulberry): eliminate this cast by changing the type of the - // parameter `candidates`. - return candidates[0] as ExecutableElementOrMember; + return candidates[0]; } var targetLibrary = targetClass.library as LibraryElementImpl; @@ -100,10 +98,7 @@ var validOverrides = <ExecutableElementOrMember>[]; for (var i = 0; i < candidates.length; i++) { - // TODO(paulberry): eliminate this cast by changing the type of the - // parameter `candidates`. - ExecutableElementOrMember? validOverride = - candidates[i] as ExecutableElementOrMember; + ExecutableElementOrMember? validOverride = candidates[i]; var validOverrideType = validOverride.type; for (var j = 0; j < candidates.length; j++) { var candidate = candidates[j]; @@ -136,7 +131,7 @@ } /// Return the result of [getInherited2] with [type] substitution. - ExecutableElement? getInherited(InterfaceType type, Name name) { + ExecutableElementOrMember? getInherited(InterfaceType type, Name name) { var rawElement = getInherited2(type.element, name); if (rawElement == null) { return null; @@ -228,7 +223,7 @@ _findMostSpecificFromNamedCandidates( element, inheritedMap, - element is ExtensionTypeElement + element is ExtensionTypeElementImpl ? interface.redeclared : interface.overridden, doTopMerge: false, @@ -417,7 +412,8 @@ /// Return all members of mixins, superclasses, and interfaces that a member /// with the given [name], defined in the [element], would override; or `null` /// if no members would be overridden. - List<ExecutableElementOrMember>? getOverridden2(InterfaceElement element, Name name) { + List<ExecutableElementOrMember>? getOverridden2( + InterfaceElement element, Name name) { var interface = getInterface(element); return interface.overridden[name]; } @@ -535,7 +531,7 @@ List<Conflict> _findMostSpecificFromNamedCandidates( InterfaceElement targetClass, Map<Name, ExecutableElement> map, - Map<Name, List<ExecutableElement>> namedCandidates, { + Map<Name, List<ExecutableElementOrMember>> namedCandidates, { required bool doTopMerge, }) { var conflicts = <Conflict>[]; @@ -623,7 +619,8 @@ // } // So, each mixin always replaces members in the interface. // And there are individual override conflicts for each mixin. - var candidatesFromSuperAndMixin = <Name, List<ExecutableElement>>{}; + var candidatesFromSuperAndMixin = + <Name, List<ExecutableElementOrMember>>{}; var mixinConflicts = <Conflict>[]; for (var entry in mixinInterface.map.entries) { var name = entry.key; @@ -807,7 +804,7 @@ } } - var redeclared = <Name, List<ExecutableElement>>{}; + var redeclared = <Name, List<ExecutableElementOrMember>>{}; var conflicts = <Conflict>[]; // Add extension type members. @@ -915,7 +912,7 @@ } // Ensure unique overridden elements. - var uniqueRedeclared = <Name, List<ExecutableElement>>{}; + var uniqueRedeclared = <Name, List<ExecutableElementOrMember>>{}; for (var entry in redeclared.entries) { var name = entry.key; var elements = entry.value; @@ -1267,7 +1264,7 @@ /// The map of names to the signatures from superinterfaces that a member /// declaration in this extension type redeclares. - final Map<Name, List<ExecutableElement>> redeclared; + final Map<Name, List<ExecutableElementOrMember>> redeclared; /// The map of names to the signatures from superinterfaces that a member /// declaration in this extension type redeclares. @@ -1308,7 +1305,7 @@ /// The map of names to their signature in the interface. @experimental - Map<Name, ExecutableElement2> get map2 { + Map<Name, ExecutableElement2OrMember> get map2 { return map.mapValue((element) => element.asElement2); } @@ -1420,7 +1417,7 @@ _ExtensionTypeCandidates(this.name); - List<ExecutableElement> get all { + List<ExecutableElementOrMember> get all { return [...methods, ...getters, ...setters]; }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart index 8b3f83f..395605a 100644 --- a/pkg/analyzer/lib/src/dart/element/member.dart +++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -55,7 +55,7 @@ String get displayName => declaration.displayName; @override - InterfaceElement2 get enclosingElement2 => _element2.enclosingElement2; + InterfaceElementImpl2 get enclosingElement2 => _element2.enclosingElement2; @override InterfaceElement get enclosingElement3 => declaration.enclosingElement3; @@ -507,7 +507,7 @@ ) : super._(); @override - FieldElement? get field { + FieldElementOrMember? get field { var field = (declaration as FieldFormalParameterElement).field; if (field == null) { return null; @@ -597,7 +597,7 @@ } @override - GetterElement? get getter2 { + GetterElement2OrMember? get getter2 { var baseGetter = declaration.getter; if (baseGetter == null) { return null; @@ -656,7 +656,7 @@ } @override - SetterElement? get setter2 { + SetterElement2OrMember? get setter2 { var baseSetter = declaration.setter; if (baseSetter == null) { return null; @@ -709,7 +709,8 @@ /// from the [definingType], create a field member representing the given /// field. Return the member that was created, or the base field if no member /// was created. - static FieldElement from(FieldElement field, InterfaceType definingType) { + static FieldElementOrMember from( + FieldElementOrMember field, InterfaceType definingType) { if (definingType.typeArguments.isEmpty) { return field; } @@ -1511,8 +1512,8 @@ /// arguments from the [definingType], create an accessor member representing /// the given accessor. Return the member that was created, or the base /// accessor if no member was created. - static PropertyAccessorElement? from( - PropertyAccessorElement? accessor, InterfaceType definingType) { + static PropertyAccessorElementOrMember? from( + PropertyAccessorElementOrMember? accessor, InterfaceType definingType) { if (accessor == null || definingType.typeArguments.isEmpty) { return accessor; }
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart index ff61e6b..388702f 100644 --- a/pkg/analyzer/lib/src/dart/element/subtype.dart +++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -6,7 +6,6 @@ show Variance; 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/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_algebra.dart'; @@ -31,28 +30,25 @@ _objectNone = _typeSystem.objectNone, _objectQuestion = _typeSystem.objectQuestion; - /// Return `true` if [T0_] is a subtype of [T1_]. - bool isSubtypeOf(DartType T0_, DartType T1_) { + /// Return `true` if [T0] is a subtype of [T1]. + bool isSubtypeOf(TypeImpl T0, TypeImpl T1) { // Reflexivity: if `T0` and `T1` are the same type then `T0 <: T1`. - if (identical(T0_, T1_)) { + if (identical(T0, T1)) { return true; } // `_` is treated as a top and a bottom type during inference. - if (identical(T0_, UnknownInferredType.instance) || - identical(T1_, UnknownInferredType.instance)) { + if (identical(T0, UnknownInferredType.instance) || + identical(T1, UnknownInferredType.instance)) { return true; } // `InvalidType` is treated as a top and a bottom type. - if (identical(T0_, InvalidTypeImpl.instance) || - identical(T1_, InvalidTypeImpl.instance)) { + if (identical(T0, InvalidTypeImpl.instance) || + identical(T1, InvalidTypeImpl.instance)) { return true; } - var T0 = T0_ as TypeImpl; - var T1 = T1_ as TypeImpl; - var T1_nullability = T1.nullabilitySuffix; var T0_nullability = T0.nullabilitySuffix; @@ -115,7 +111,7 @@ // Extension types require explicit `Object` implementation. if (T0 is InterfaceTypeImpl && T0.element3 is ExtensionTypeElement2) { for (var interface in T0.interfaces) { - if (isSubtypeOf(interface, T1_)) { + if (isSubtypeOf(interface, T1)) { return true; } } @@ -303,19 +299,19 @@ } bool _interfaceArguments( - InterfaceElement2 element, - InterfaceType subType, - InterfaceType superType, + InterfaceElementImpl2 element, + InterfaceTypeImpl subType, + InterfaceTypeImpl superType, ) { - List<TypeParameterElement2> parameters = element.typeParameters2; - List<DartType> subArguments = subType.typeArguments; - List<DartType> superArguments = superType.typeArguments; + var parameters = element.typeParameters2; + var subArguments = subType.typeArguments; + var superArguments = superType.typeArguments; assert(subArguments.length == superArguments.length); assert(parameters.length == subArguments.length); - for (int i = 0; i < subArguments.length; i++) { - var parameter = parameters[i] as TypeParameterElementImpl2; + for (var i = 0; i < subArguments.length; i++) { + var parameter = parameters[i]; var subArgument = subArguments[i]; var superArgument = superArguments[i]; @@ -344,7 +340,7 @@ } /// Check that [f] is a subtype of [g]. - bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionType g) { + bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionTypeImpl g) { var fresh = _typeSystem.relateTypeParameters2(f.typeParameters, g.typeParameters); if (fresh == null) { @@ -440,7 +436,10 @@ return true; } - bool _isInterfaceSubtypeOf(InterfaceType subType, InterfaceType superType) { + bool _isInterfaceSubtypeOf( + InterfaceTypeImpl subType, + InterfaceTypeImpl superType, + ) { // Note: we should never reach `_isInterfaceSubtypeOf` with `i2 == Object`, // because top types are eliminated before `isSubtypeOf` calls this. // TODO(scheglov): Replace with assert(). @@ -468,7 +467,7 @@ if (identical(interface.element3, superElement)) { var substitution = Substitution.fromInterfaceType(subType); var substitutedInterface = - substitution.substituteType(interface) as InterfaceType; + substitution.substituteType(interface) as InterfaceTypeImpl; return _interfaceArguments( superElement, substitutedInterface, @@ -481,7 +480,7 @@ } /// Check that [subType] is a subtype of [superType]. - bool _isRecordSubtypeOf(RecordType subType, RecordType superType) { + bool _isRecordSubtypeOf(RecordTypeImpl subType, RecordTypeImpl superType) { var subPositional = subType.positionalFields; var superPositional = superType.positionalFields; if (subPositional.length != superPositional.length) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart index a531e33..881069a 100644 --- a/pkg/analyzer/lib/src/dart/element/type.dart +++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -217,11 +217,11 @@ }; @override - List<DartType> get normalParameterTypes => + List<TypeImpl> get normalParameterTypes => positionalParameterTypes.sublist(0, requiredPositionalParameterCount); @override - List<DartType> get optionalParameterTypes => + List<TypeImpl> get optionalParameterTypes => positionalParameterTypes.sublist(requiredPositionalParameterCount); @override @@ -645,7 +645,7 @@ @override List<PropertyAccessorElement> get accessors { if (_accessors == null) { - List<PropertyAccessorElement> accessors = element.accessors; + var accessors = element.accessors; var members = <PropertyAccessorElement>[]; for (int i = 0; i < accessors.length; i++) { members.add(PropertyAccessorMember.from(accessors[i], this)!); @@ -937,7 +937,7 @@ } @override - PropertyAccessorElement? getGetter(String getterName) => + PropertyAccessorElementOrMember? getGetter(String getterName) => PropertyAccessorMember.from(element.getGetter(getterName), this); @override @@ -999,7 +999,7 @@ } } else { var result = inheritance.getInherited(this, nameObj); - if (result is PropertyAccessorElement) { + if (result is PropertyAccessorElementOrMember) { return result; } } @@ -1036,7 +1036,7 @@ } @override - MethodElement? lookUpMethod2( + MethodElementOrMember? lookUpMethod2( String name, LibraryElement library, { bool concrete = false, @@ -1054,7 +1054,7 @@ } } else { var result = inheritance.getInherited(this, nameObj); - if (result is MethodElement) { + if (result is MethodElementOrMember) { return result; } } @@ -1074,7 +1074,7 @@ } @override - MethodElement2? lookUpMethod3( + MethodElement2OrMember? lookUpMethod3( String name, LibraryElement2 library, { bool concrete = false, @@ -1109,7 +1109,7 @@ } } else { var result = inheritance.getInherited(this, nameObj); - if (result is PropertyAccessorElement) { + if (result is PropertyAccessorElementOrMember) { return result; } }
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart index ab9201b..a3784d7 100644 --- a/pkg/analyzer/lib/src/dart/element/type_system.dart +++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -520,8 +520,8 @@ /// /// This does not find extension methods (which are not defined on an /// interface type); it is meant to find implicit call references. - FunctionType? getCallMethodType(DartType t) { - if (t is InterfaceType) { + FunctionTypeImpl? getCallMethodType(DartType t) { + if (t is InterfaceTypeImpl) { return t .lookUpMethod3(MethodElement2.CALL_METHOD_NAME, t.element3.library2) ?.type; @@ -859,8 +859,11 @@ } @override - bool isAssignableTo(DartType fromType, DartType toType, - {bool strictCasts = false}) { + bool isAssignableTo( + covariant TypeImpl fromType, + covariant TypeImpl toType, { + bool strictCasts = false, + }) { // An actual subtype if (isSubtypeOf(fromType, toType)) { return true; @@ -872,7 +875,7 @@ } // A 'call' method tearoff. - if (fromType is InterfaceType && + if (fromType is InterfaceTypeImpl && !isNullable(fromType) && acceptsFunctionType(toType)) { var callMethodType = getCallMethodType(fromType); @@ -920,7 +923,7 @@ /// Implements: /// https://github.com/dart-lang/language /// See `resources/type-system/subtyping.md#type-equality` - bool isEqualTo(DartType left, DartType right) { + bool isEqualTo(TypeImpl left, TypeImpl right) { return isSubtypeOf(left, right) && isSubtypeOf(right, left); } @@ -1281,7 +1284,10 @@ /// https://github.com/dart-lang/language /// See `resources/type-system/subtyping.md` @override - bool isSubtypeOf(DartType leftType, DartType rightType) { + bool isSubtypeOf( + covariant TypeImpl leftType, + covariant TypeImpl rightType, + ) { return _subtypeHelper.isSubtypeOf(leftType, rightType); } @@ -1498,9 +1504,9 @@ /// left operand has the type [leftType] and whose right operand has the type /// [rightType], given that resolution has so far produced the [currentType]. TypeImpl refineBinaryExpressionType( - DartType leftType, + TypeImpl leftType, TokenType operator, - DartType rightType, + TypeImpl rightType, TypeImpl currentType, MethodElement2? operatorElement) { if (operatorElement == null) return currentType; @@ -1514,9 +1520,9 @@ /// [invocationContext], and the context type produced so far by resolution is /// [currentType]. TypeImpl refineNumericInvocationContext2( - DartType? targetType, + TypeImpl? targetType, Element2? methodElement, - DartType invocationContext, + TypeImpl invocationContext, TypeImpl currentType) { if (targetType != null && methodElement is MethodElement2) { return _refineNumericInvocationContextNullSafe( @@ -1534,9 +1540,9 @@ /// // TODO(scheglov): I expected that [methodElement] is [MethodElement]. TypeImpl refineNumericInvocationType( - DartType targetType, + TypeImpl targetType, Element2? methodElement, - List<DartType> argumentTypes, + List<TypeImpl> argumentTypes, TypeImpl currentType) { if (methodElement is MethodElement2) { return _refineNumericInvocationTypeNullSafe( @@ -1554,7 +1560,7 @@ /// be used to instantiate both function types, allowing further comparison. RelatedTypeParameters2? relateTypeParameters2( List<TypeParameterElementImpl2> typeParameters1, - List<TypeParameterElement2> typeParameters2, + List<TypeParameterElementImpl2> typeParameters2, ) { if (typeParameters1.length != typeParameters2.length) { return null; @@ -1824,9 +1830,9 @@ } TypeImpl _refineNumericInvocationContextNullSafe( - DartType targetType, + TypeImpl targetType, MethodElement2 methodElement, - DartType invocationContext, + TypeImpl invocationContext, TypeImpl currentType) { // If the method being invoked comes from an extension, don't refine the // type because we can only make guarantees about methods defined in the @@ -1926,9 +1932,9 @@ } TypeImpl _refineNumericInvocationTypeNullSafe( - DartType targetType, + TypeImpl targetType, MethodElement2 methodElement, - List<DartType> argumentTypes, + List<TypeImpl> argumentTypes, TypeImpl currentType) { // If the method being invoked comes from an extension, don't refine the // type because we can only make guarantees about methods defined in the
diff --git a/pkg/analyzer/lib/src/dart/element/well_bounded.dart b/pkg/analyzer/lib/src/dart/element/well_bounded.dart index 5acc140..6324e93 100644 --- a/pkg/analyzer/lib/src/dart/element/well_bounded.dart +++ b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
@@ -4,6 +4,7 @@ import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_algebra.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; @@ -73,18 +74,18 @@ return _isSuperBounded(type); } - TypeBoundedResult _isRegularBounded(DartType type) { + TypeBoundedResult _isRegularBounded(TypeImpl type) { List<TypeArgumentIssue>? issues; String? elementName; - List<TypeParameterElement2> typeParameters; - List<DartType> typeArguments; + List<TypeParameterElementImpl2> typeParameters; + List<TypeImpl> typeArguments; var alias = type.alias; if (alias != null) { elementName = alias.element2.name3; typeParameters = alias.element2.typeParameters2; typeArguments = alias.typeArguments; - } else if (type is InterfaceType) { + } else if (type is InterfaceTypeImpl) { elementName = type.element3.name3; typeParameters = type.element3.typeParameters2; typeArguments = type.typeArguments;
diff --git a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart index 7fef4bf..ae364e2 100644 --- a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart +++ b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
@@ -18,7 +18,7 @@ class InstantiatedExtensionWithMember { final _NotInstantiatedExtensionWithMember candidate; final MapSubstitution substitution; - final DartType extendedType; + final TypeImpl extendedType; InstantiatedExtensionWithMember( this.candidate, @@ -71,7 +71,7 @@ R instantiate({ required MapSubstitution substitution, - required DartType extendedType, + required TypeImpl extendedType, }); } @@ -87,7 +87,7 @@ @override InstantiatedExtensionWithMember instantiate({ required MapSubstitution substitution, - required DartType extendedType, + required TypeImpl extendedType, }) { return InstantiatedExtensionWithMember(this, substitution, extendedType); }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart index 513792d..a656434 100644 --- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -116,9 +116,9 @@ } void _checkForInvalidAssignment( - DartType writeType, + TypeImpl writeType, Expression right, - DartType rightType, { + TypeImpl rightType, { required Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted, }) { if (writeType is! VoidType && _checkForUseOfVoidResult(right)) { @@ -131,10 +131,10 @@ return; } - if (writeType is RecordType && + if (writeType is RecordTypeImpl && writeType.positionalFields.length == 1 && rightType is! RecordType && - right is ParenthesizedExpression) { + right is ParenthesizedExpressionImpl) { var field = writeType.positionalFields.first; if (_typeSystem.isAssignableTo(field.type, rightType, strictCasts: strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart index 25aa44a..e88b9f0 100644 --- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -280,7 +280,7 @@ void _resolveRightOperand( BinaryExpressionImpl node, - DartType contextType, + TypeImpl contextType, ) { var left = node.leftOperand; @@ -317,7 +317,7 @@ } void _resolveUserDefinable(BinaryExpressionImpl node, - {required DartType contextType}) { + {required TypeImpl contextType}) { var left = node.leftOperand; if (left is AugmentedExpressionImpl) { @@ -354,7 +354,7 @@ void _resolveUserDefinableAugmented( BinaryExpressionImpl node, { required AugmentedExpressionImpl left, - required DartType contextType, + required TypeImpl contextType, }) { var methodName = node.operator.lexeme;
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart index fa2bcf0..a1c78f6 100644 --- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart +++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -17,7 +17,7 @@ /// The imposed return type, from the typing context. /// Might be `null` if an empty typing context. - final DartType? imposedType; + final TypeImpl? imposedType; /// The context type, computed from [imposedType]. /// Might be `null` if an empty typing context.
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart index 8742ef4..8a00bab 100644 --- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -5,6 +5,7 @@ import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/member.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/error/codes.dart'; @@ -31,7 +32,8 @@ var element = node.constructorName.element; if (element != null && !element.isFactory) { var enclosingElement = element.enclosingElement2; - if (enclosingElement is ClassElement2 && enclosingElement.isAbstract) { + if (enclosingElement is ClassElementImpl2 && + enclosingElement.isAbstract) { _resolver.errorReporter.atNode( node, CompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart index eca3161..d9112eb 100644 --- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -260,7 +260,7 @@ void _checkTypeArgumentsMatchingBounds( List<TypeParameterElementImpl2> typeParameters, TypeArgumentList? typeArgumentList, - List<DartType> typeArgumentTypes, + List<TypeImpl> typeArgumentTypes, Substitution substitution, ) { if (typeArgumentList != null) { @@ -333,7 +333,7 @@ /// If the number of explicit type arguments is different than the number /// of extension's type parameters, or inference fails, returns `dynamic` /// for all type parameters. - List<DartType>? _inferTypeArguments( + List<TypeImpl>? _inferTypeArguments( ExtensionOverrideImpl node, TypeImpl receiverType, {required TypeConstraintGenerationDataForTesting? dataForTesting, required AstNodeImpl? nodeForTesting}) { @@ -345,7 +345,7 @@ var arguments = typeArguments.arguments; if (arguments.length == typeParameters.length) { if (typeParameters.isEmpty) { - return const <DartType>[]; + return const <TypeImpl>[]; } return arguments.map((a) => a.typeOrThrow).toList(); } else { @@ -385,7 +385,7 @@ /// Instantiate the extended type of the [extension] to the bounds of the /// type formals of the extension. - DartType _instantiateToBounds(ExtensionElement2 extension) { + TypeImpl _instantiateToBounds(ExtensionElement2 extension) { extension as ExtensionElementImpl2; var typeParameters = extension.typeParameters2; return Substitution.fromPairs2( @@ -436,11 +436,11 @@ } /// Ask the type system for a subtype check. - bool _isSubtypeOf(DartType type1, DartType type2) => + bool _isSubtypeOf(TypeImpl type1, TypeImpl type2) => _typeSystem.isSubtypeOf(type1, type2); - List<DartType> _listOfDynamic(List<Object?> parameters) { - return List<DartType>.filled(parameters.length, DynamicTypeImpl.instance); + List<TypeImpl> _listOfDynamic(List<Object?> parameters) { + return List<TypeImpl>.filled(parameters.length, DynamicTypeImpl.instance); } static bool _isCascadeTarget(ExtensionOverride node) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart index 841e859..03ff427 100644 --- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -193,7 +193,7 @@ _resolve(node, rawType, whyNotPromotedArguments, contextType: contextType); } - void _unresolved(FunctionExpressionInvocationImpl node, DartType type, + void _unresolved(FunctionExpressionInvocationImpl node, TypeImpl type, List<WhyNotPromotedGetter> whyNotPromotedArguments, {required TypeImpl contextType}) { _setExplicitTypeArgumentTypes(node); @@ -218,7 +218,7 @@ .map((typeArgument) => typeArgument.typeOrThrow) .toList(); } else { - node.typeArgumentTypes = const <DartType>[]; + node.typeArgumentTypes = const <TypeImpl>[]; } } }
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart index abee317..44592796 100644 --- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart +++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -159,7 +159,7 @@ var typeArgumentList = _typeArguments; var originalType = rawType; - List<DartType>? typeArgumentTypes; + List<TypeImpl>? typeArgumentTypes; GenericInferrer? inferrer; Substitution? substitution; if (_isGenericInferenceDisabled) { @@ -171,7 +171,7 @@ substitution = Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes); } else { - typeArgumentTypes = const <DartType>[]; + typeArgumentTypes = const <TypeImpl>[]; } } else if (typeArgumentList != null) { if (rawType != null && @@ -216,7 +216,7 @@ Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes); } } else if (rawType == null || rawType.typeFormals.isEmpty) { - typeArgumentTypes = const <DartType>[]; + typeArgumentTypes = const <TypeImpl>[]; } else { var typeParameters = [for (var tp in rawType.typeFormals) tp.element]; rawType = @@ -331,7 +331,7 @@ } List<FormalParameterElement>? _storeResult( - List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) { + List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) { return invokeType?.formalParameters; } } @@ -424,7 +424,7 @@ @override List<FormalParameterElement>? _storeResult( - List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) { + List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) { node.typeArgumentTypes = typeArgumentTypes; node.staticInvokeType = invokeType ?? DynamicTypeImpl.instance; return super._storeResult(typeArgumentTypes, invokeType);
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart index 6c6f492..693df05 100644 --- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -77,7 +77,7 @@ /// // TODO(scheglov): this is duplicate void _checkForInvalidAssignmentIncDec( - PostfixExpression node, Expression operand, DartType type) { + PostfixExpressionImpl node, Expression operand, TypeImpl type) { var operandWriteType = node.writeType!; if (!_typeSystem.isAssignableTo(type, operandWriteType, strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart index 5d6be72..937cc3c 100644 --- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -99,7 +99,7 @@ /// // TODO(scheglov): this is duplicate void _checkForInvalidAssignmentIncDec( - PrefixExpressionImpl node, DartType type) { + PrefixExpressionImpl node, TypeImpl type) { var operandWriteType = node.writeType!; if (!_typeSystem.isAssignableTo(type, operandWriteType, strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart index 0c2bccf..fa1bfb4 100644 --- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart +++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -13,7 +13,6 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/scope.dart'; -import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; @@ -1825,7 +1824,7 @@ void _verifyExtensionElementImplements( ExtensionTypeElementImpl declaredElement, NamedTypeImpl node, - DartType type, + TypeImpl type, ) { var typeSystem = _libraryElement.typeSystem;
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart index 6e29942..16a1fc7 100644 --- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart +++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import 'package:_fe_analyzer_shared/src/types/shared_type.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/ast/extensions.dart'; @@ -78,7 +77,7 @@ var expression = node.expression; var expressionType = expression.typeOrThrow; - DartType impliedReturnType; + TypeImpl impliedReturnType; if (isYieldEach) { impliedReturnType = expressionType; } else if (bodyContext.isSynchronous) { @@ -124,7 +123,7 @@ // Since the declared return type might have been "dynamic", we need to // also check that the implied return type is assignable to generic // Iterable/Stream. - DartType requiredReturnType; + TypeImpl requiredReturnType; if (bodyContext.isSynchronous) { requiredReturnType = _typeProvider.iterableDynamicType; } else {
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart index 7d26f0f..4052ed8 100644 --- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart +++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -5,7 +5,6 @@ import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart'; import 'package:_fe_analyzer_shared/src/types/shared_type.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/ast/extensions.dart'; @@ -20,7 +19,7 @@ final ErrorReporter _errorReporter; final NullableDereferenceVerifier _nullableDereferenceVerifier; - final InterfaceType _boolType; + final InterfaceTypeImpl _boolType; BoolExpressionVerifier({ required ResolverVisitor resolver,
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart index fd76e89..c366c9b 100644 --- a/pkg/analyzer/lib/src/error/correct_override.dart +++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -21,7 +21,7 @@ final TypeSystemImpl _typeSystem; final ExecutableElement2OrMember _thisMember; - FunctionType? _thisTypeForSubtype; + FunctionTypeImpl? _thisTypeForSubtype; final DiagnosticFactory _diagnosticFactory = DiagnosticFactory(); @@ -35,7 +35,7 @@ /// Return `true` if [_thisMember] is a correct override of [superMember]. bool isCorrectOverrideOf({ - required ExecutableElement2 superMember, + required ExecutableElement2OrMember superMember, }) { var superType = superMember.type; return _typeSystem.isSubtypeOf(_thisTypeForSubtype!, superType); @@ -44,7 +44,7 @@ /// If [_thisMember] is not a correct override of [superMember], report the /// error. void verify({ - required ExecutableElement2 superMember, + required ExecutableElement2OrMember superMember, required ErrorReporter errorReporter, required SyntacticEntity errorNode, required ErrorCode errorCode, @@ -100,10 +100,10 @@ final AnalysisSessionImpl _session; final TypeSystemImpl _typeSystem; - final ExecutableElement2 _thisMember; + final ExecutableElement2OrMember _thisMember; CovariantParametersVerifier({ - required ExecutableElement2 thisMember, + required ExecutableElement2OrMember thisMember, }) : _session = thisMember.library2.session as AnalysisSessionImpl, _typeSystem = thisMember.library2.typeSystem as TypeSystemImpl, _thisMember = thisMember; @@ -159,8 +159,8 @@ return superMembers; } - Map<FormalParameterElement, List<_SuperParameter>> _superParameters() { - var result = <FormalParameterElement, List<_SuperParameter>>{}; + Map<FormalParameterElementMixin, List<_SuperParameter>> _superParameters() { + var result = <FormalParameterElementMixin, List<_SuperParameter>>{}; List<_SuperMember>? superMembers; var parameters = _thisMember.formalParameters; @@ -267,7 +267,7 @@ class _SuperParameter { final FormalParameterElement element; - final DartType type; + final TypeImpl type; _SuperParameter(this.element, this.type);
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart index c87361a..f976e01 100644 --- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart +++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -6,12 +6,12 @@ import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element2.dart'; -import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/source/source_range.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/element/element.dart'; +import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart'; import 'package:analyzer/src/dart/resolver/scope.dart'; @@ -378,7 +378,7 @@ } } - void verifyCatchClause(CatchClause node) { + void verifyCatchClause(CatchClauseImpl node) { var verifier = _catchClausesVerifiers.last; if (verifier._done) return; @@ -506,7 +506,7 @@ final List<CatchClause> catchClauses; bool _done = false; - final List<DartType> _visitedTypes = <DartType>[]; + final List<TypeImpl> _visitedTypes = []; _CatchClausesVerifier( this._typeSystem, @@ -514,7 +514,7 @@ this.catchClauses, ); - void nextCatchClause(CatchClause catchClause) { + void nextCatchClause(CatchClauseImpl catchClause) { var currentType = catchClause.exceptionType?.type; // Found catch clause that doesn't have an exception type.
diff --git a/pkg/analyzer/lib/src/error/error_handler_verifier.dart b/pkg/analyzer/lib/src/error/error_handler_verifier.dart index d9b3cb3..f138efb 100644 --- a/pkg/analyzer/lib/src/error/error_handler_verifier.dart +++ b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
@@ -9,6 +9,7 @@ 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/element/type.dart'; import 'package:analyzer/src/dart/element/type_provider.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; import 'package:analyzer/src/error/codes.dart'; @@ -94,7 +95,7 @@ if (callbackType == null) { return; } - if (callbackType is FunctionType) { + if (callbackType is FunctionTypeImpl) { // TODO(srawlins): Also check return type of the 'onError' named // argument to [Future<T>.then]. _checkErrorHandlerFunctionType( @@ -117,7 +118,7 @@ if (callbackType == null) { return; } - if (callbackType is FunctionType) { + if (callbackType is FunctionTypeImpl) { _checkErrorHandlerFunctionType( callback, callbackType, _typeProvider.voidType, checkFirstParameterType: callback is FunctionExpression); @@ -139,7 +140,7 @@ if (callbackType == null) { return; } - if (callbackType is FunctionType) { + if (callbackType is FunctionTypeImpl) { _checkErrorHandlerFunctionType( callback, callbackType, _typeProvider.voidType, checkFirstParameterType: callback.expression is FunctionExpression); @@ -160,7 +161,7 @@ if (callbackType == null) { return; } - if (callbackType is FunctionType) { + if (callbackType is FunctionTypeImpl) { _checkErrorHandlerFunctionType( callback, callbackType, _typeProvider.voidType, checkFirstParameterType: callback is FunctionExpression); @@ -178,7 +179,7 @@ /// Certain error handlers are allowed to specify a different type for their /// first parameter. void _checkErrorHandlerFunctionType(Expression expression, - FunctionType expressionType, DartType expectedFunctionReturnType, + FunctionTypeImpl expressionType, DartType expectedFunctionReturnType, {bool checkFirstParameterType = true}) { void report() { _errorReporter.atNode( @@ -223,7 +224,7 @@ var expectedReturnType = _typeProvider.futureOrType(targetFutureType); if (callback is FunctionExpressionImpl) { // TODO(migration): should be FunctionType, not nullable - var callbackType = callback.staticType as FunctionType; + var callbackType = callback.staticType as FunctionTypeImpl; _checkErrorHandlerFunctionType( callback, callbackType, expectedReturnType); var catchErrorOnErrorExecutable = EnclosingExecutableContext( @@ -237,7 +238,7 @@ callback.body.accept(returnStatementVerifier); } else { var callbackType = callback.staticType; - if (callbackType is FunctionType) { + if (callbackType is FunctionTypeImpl) { _checkReturnType(expectedReturnType, callbackType.returnType, callback); _checkErrorHandlerFunctionType( callback, callbackType, expectedReturnType); @@ -249,7 +250,7 @@ } void _checkReturnType( - DartType expectedType, DartType functionReturnType, Expression callback) { + TypeImpl expectedType, TypeImpl functionReturnType, Expression callback) { if (!_typeSystem.isAssignableTo(functionReturnType, expectedType, strictCasts: _strictCasts)) { _errorReporter.atNode(
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart index 79fff63..398e21e 100644 --- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart +++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -3,9 +3,10 @@ // BSD-style license that can be found in the LICENSE file. 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/element/element.dart'; import 'package:analyzer/src/dart/element/inheritance_manager3.dart'; +import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; import 'package:analyzer/src/error/codes.dart'; @@ -22,18 +23,19 @@ }) : _typeSystem = typeSystem, _errorReporter = errorReporter; - void checkExtension(ExtensionElement2 element) { + void checkExtension(ExtensionElementImpl2 element) { for (var getter in element.getters2) { _checkLocalGetter(getter); } } - void checkExtensionType(ExtensionTypeElement2 element, Interface interface) { + void checkExtensionType( + ExtensionTypeElementImpl2 element, Interface interface) { checkInterface(element, interface); checkStaticGetters(element.getters2); } - void checkInterface(InterfaceElement2 element, Interface interface) { + void checkInterface(InterfaceElementImpl2 element, Interface interface) { var libraryUri = element.library2.uri; var interfaceMap = interface.map2; @@ -50,7 +52,7 @@ if (!_typeSystem.isSubtypeOf(getterType, setterType)) { Element2 errorElement; if (getter.enclosingElement2 == element) { - if (element is ExtensionTypeElement2 && + if (element is ExtensionTypeElementImpl2 && element.representation2.getter2 == getter) { errorElement = setter; } else { @@ -85,7 +87,7 @@ } } - void checkStaticGetters(List<GetterElement> getters) { + void checkStaticGetters(List<GetterElement2OrMember> getters) { for (var getter in getters) { if (getter.isStatic) { _checkLocalGetter(getter); @@ -93,7 +95,7 @@ } } - void _checkLocalGetter(GetterElement getter) { + void _checkLocalGetter(GetterElement2OrMember getter) { var name = getter.name3; if (name == null) { return; @@ -120,12 +122,12 @@ } /// Return the return type of the [getter]. - static DartType _getGetterType(GetterElement getter) { + static TypeImpl _getGetterType(GetterElement2OrMember getter) { return getter.returnType; } /// Return the type of the first parameter of the [setter]. - static DartType? _getSetterType(SetterElement setter) { + static TypeImpl? _getSetterType(SetterElement2OrMember setter) { var parameters = setter.formalParameters; if (parameters.isNotEmpty) { return parameters[0].type;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart index c151e6f..8f72ae4 100644 --- a/pkg/analyzer/lib/src/error/inheritance_override.dart +++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -297,7 +297,7 @@ GetterSetterTypesVerifier( typeSystem: typeSystem, errorReporter: reporter, - ).checkInterface(fragment.asElement2, interface); + ).checkInterface((fragment as InterfaceElementImpl).asElement2, interface); if (declaration is ClassElement && !declaration.isAbstract || declaration is EnumElement) {
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart index 59aeddb..b96037a 100644 --- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart +++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -51,7 +51,7 @@ /// Check that the given [type] is assignable to the [elementType], otherwise /// report the list or set error on the [errorNode]. - void _checkAssignableToElementType(DartType type, AstNode errorNode) { + void _checkAssignableToElementType(TypeImpl type, AstNode errorNode) { var elementType = this.elementType; if (!typeSystem.isAssignableTo(type, elementType!,
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart index aae43ae..1a06e47 100644 --- a/pkg/analyzer/lib/src/error/return_type_verifier.dart +++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -3,12 +3,12 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/ast/ast.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/error/error.dart'; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/ast/extensions.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_provider.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; @@ -82,7 +82,7 @@ return; } - void checkElement(ClassElement2 expectedElement, ErrorCode errorCode) { + void checkElement(ClassElementImpl2 expectedElement, ErrorCode errorCode) { void reportError() { enclosingExecutable.hasLegalReturnType = false; _errorReporter.atNode( @@ -291,8 +291,8 @@ ); } - bool _isLegalReturnType(ClassElement2 expectedElement) { - DartType returnType = enclosingExecutable.returnType; + bool _isLegalReturnType(ClassElementImpl2 expectedElement) { + var returnType = enclosingExecutable.returnType; // // When checking an async/sync*/async* method, we know the exact type // that will be returned (e.g. Future, Iterable, or Stream).
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart index 32dff3f..8d6ff67 100644 --- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart +++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -13,6 +13,7 @@ import 'package:analyzer/error/listener.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; import 'package:analyzer/src/dart/ast/extensions.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/dart/element/type.dart'; import 'package:analyzer/src/dart/element/type_algebra.dart'; import 'package:analyzer/src/dart/element/type_system.dart'; @@ -34,12 +35,12 @@ TypeSystemImpl get _typeSystem => _libraryElement.typeSystem as TypeSystemImpl; - void checkConstructorReference(ConstructorReference node) { + void checkConstructorReference(ConstructorReferenceImpl node) { var classElement = node.constructorName.type.element2; - List<TypeParameterElement2> typeParameters; - if (classElement is TypeAliasElement2) { + List<TypeParameterElementImpl2> typeParameters; + if (classElement is TypeAliasElementImpl2) { typeParameters = classElement.typeParameters2; - } else if (classElement is InterfaceElement2) { + } else if (classElement is InterfaceElementImpl2) { typeParameters = classElement.typeParameters2; } else { return; @@ -99,7 +100,7 @@ } } - void checkEnumConstantDeclaration(EnumConstantDeclaration node) { + void checkEnumConstantDeclaration(EnumConstantDeclarationImpl node) { var constructorElement = node.constructorElement2; if (constructorElement == null) { return; @@ -293,9 +294,9 @@ return; } - List<TypeParameterElement2> typeParameters; + List<TypeParameterElementImpl2> typeParameters; String? elementName; - List<DartType> typeArguments; + List<TypeImpl> typeArguments; var alias = type.alias; if (alias != null) { elementName = alias.element2.name3; @@ -329,7 +330,7 @@ var typeArgument = typeArguments[i]; - if (typeArgument is FunctionType && + if (typeArgument is FunctionTypeImpl && typeArgument.typeParameters.isNotEmpty) { if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) { _errorReporter.atNode( @@ -421,7 +422,7 @@ // Prepare type arguments for checking for super-bounded. var invertedType = _typeSystem.replaceTopAndBottom(type); - List<DartType> invertedTypeArguments; + List<TypeImpl> invertedTypeArguments; var invertedAlias = invertedType.alias; if (invertedAlias != null) { invertedTypeArguments = invertedAlias.typeArguments; @@ -499,9 +500,9 @@ // <TFrom, TTo extends Iterable<TFrom>> // <T extends Cloneable<T>> // - DartType argType = typeArgs[i]; + var argType = typeArgs[i]; - if (argType is FunctionType && argType.typeParameters.isNotEmpty) { + if (argType is FunctionTypeImpl && argType.typeParameters.isNotEmpty) { if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) { _errorReporter.atNode( typeArgumentList[i],
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index c3d4e47..65bf042 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -4063,9 +4063,6 @@ feature: ExperimentalFeatures.dot_shorthands, startToken: token, ); - - // Recovery. - pop(); } // TODO(kallentu): Handle dot shorthands.
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart index 935a8c0..bba1e30 100644 --- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart +++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -41,8 +41,8 @@ /// argument. void checkForArgumentTypeNotAssignable( Expression expression, - DartType expectedStaticType, - DartType actualStaticType, + TypeImpl expectedStaticType, + TypeImpl actualStaticType, ErrorCode errorCode, {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) { if (expectedStaticType is! VoidType && @@ -73,8 +73,8 @@ void checkForAssignableExpressionAtType( Expression expression, - DartType actualStaticType, - DartType expectedStaticType, + TypeImpl actualStaticType, + TypeImpl expectedStaticType, ErrorCode errorCode, {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) { if (expectedStaticType is! VoidType && @@ -94,7 +94,7 @@ return node; } - if (expectedStaticType is RecordType && + if (expectedStaticType is RecordTypeImpl && expectedStaticType.positionalFields.length == 1 && actualStaticType is! RecordType && expression is ParenthesizedExpression) { @@ -111,8 +111,8 @@ } if (errorCode == CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE) { var additionalInfo = <String>[]; - if (expectedStaticType is RecordType && - actualStaticType is RecordType) { + if (expectedStaticType is RecordTypeImpl && + actualStaticType is RecordTypeImpl) { var actualPositionalFields = actualStaticType.positionalFields.length; var expectedPositionalFields = expectedStaticType.positionalFields.length; @@ -169,16 +169,17 @@ /// See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and /// [CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE]. void checkForFieldInitializerNotAssignable( - ConstructorFieldInitializer initializer, FieldElement2 fieldElement, + ConstructorFieldInitializerImpl initializer, + FieldElement2OrMember fieldElement, {required bool isConstConstructor, required Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) { // prepare field type - DartType fieldType = fieldElement.type; + var fieldType = fieldElement.type; // prepare expression type Expression expression = initializer.expression; // test the static type of the expression - DartType staticType = expression.typeOrThrow; + var staticType = expression.typeOrThrow; if (typeSystem.isAssignableTo(staticType, fieldType, strictCasts: strictCasts)) { if (fieldType is! VoidType) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart index 9182bbd..8779e9e 100644 --- a/pkg/analyzer/lib/src/generated/error_verifier.dart +++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -168,7 +168,7 @@ final CompilationUnitElementImpl _currentUnit; /// The type representing the type 'int'. - late final InterfaceType _intType; + late final InterfaceTypeImpl _intType; /// The options for verification. final AnalysisOptions options; @@ -217,7 +217,7 @@ /// The class containing the AST nodes being visited, or `null` if we are not /// in the scope of a class. - InterfaceElement2? _enclosingClass; + InterfaceElementImpl2? _enclosingClass; /// The element of the extension being visited, or `null` if we are not /// in the scope of an extension. @@ -628,13 +628,13 @@ } @override - void visitConstructorReference(ConstructorReference node) { + void visitConstructorReference(covariant ConstructorReferenceImpl node) { _typeArgumentsVerifier.checkConstructorReference(node); _checkForInvalidGenerativeConstructorReference(node.constructorName); } @override - void visitDefaultFormalParameter(DefaultFormalParameter node) { + void visitDefaultFormalParameter(covariant DefaultFormalParameterImpl node) { var defaultValue = node.defaultValue; if (defaultValue != null) { checkForAssignableExpressionAtType( @@ -649,7 +649,8 @@ } @override - void visitEnumConstantDeclaration(EnumConstantDeclaration node) { + void visitEnumConstantDeclaration( + covariant EnumConstantDeclarationImpl node) { var element = node.declaredElement as FieldElementImpl; _checkAugmentations( @@ -1332,7 +1333,7 @@ } @override - void visitPostfixExpression(PostfixExpression node) { + void visitPostfixExpression(covariant PostfixExpressionImpl node) { var operand = node.operand; if (node.operator.type == TokenType.BANG) { checkForUseOfVoidResult(node); @@ -1356,9 +1357,9 @@ } @override - void visitPrefixExpression(PrefixExpression node) { - TokenType operatorType = node.operator.type; - Expression operand = node.operand; + void visitPrefixExpression(covariant PrefixExpressionImpl node) { + var operatorType = node.operator.type; + var operand = node.operand; if (operatorType != TokenType.BANG) { if (operatorType.isIncrementOperator) { _checkForAssignmentToFinal(operand); @@ -1705,7 +1706,7 @@ void _checkAugmentationTypeParameters({ required Token nameToken, required TypeParameterList? typeParameterList, - required List<TypeParameterElement> declarationTypeParameters, + required List<TypeParameterElementImpl> declarationTypeParameters, }) { if (declarationTypeParameters.isEmpty) { if (typeParameterList != null) { @@ -1897,7 +1898,7 @@ InterfaceElementImpl declarationElement, NamedCompilationUnitMember node, NamedType? superclass, - WithClause? withClause, + WithClauseImpl? withClause, ImplementsClause? implementsClause) { // Only check for all of the inheritance logic around clauses if there // isn't an error code such as "Cannot extend double" already on the @@ -1996,7 +1997,7 @@ /// /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR], /// [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]. - bool _checkForAllMixinErrorCodes(WithClause? withClause) { + bool _checkForAllMixinErrorCodes(WithClauseImpl? withClause) { if (withClause == null) { return false; } @@ -2005,7 +2006,7 @@ for (int mixinNameIndex = 0; mixinNameIndex < withClause.mixinTypes.length; mixinNameIndex++) { - NamedType mixinName = withClause.mixinTypes[mixinNameIndex]; + var mixinName = withClause.mixinTypes[mixinNameIndex]; DartType mixinType = mixinName.typeOrThrow; if (mixinType is InterfaceType) { mixinTypeIndex++; @@ -2048,7 +2049,7 @@ /// Check for errors related to the redirected constructors. void _checkForAllRedirectConstructorErrorCodes( - ConstructorDeclaration declaration) { + ConstructorDeclarationImpl declaration) { // Prepare redirected constructor node var redirectedConstructor = declaration.redirectedConstructor; if (redirectedConstructor == null) { @@ -2076,12 +2077,12 @@ } return; } - FunctionType redirectedType = redirectedElement.type; - DartType redirectedReturnType = redirectedType.returnType; + var redirectedType = redirectedElement.type; + var redirectedReturnType = redirectedType.returnType; // Report specific problem when return type is incompatible - FunctionType constructorType = declaration.declaredFragment!.element.type; - DartType constructorReturnType = constructorType.returnType; + var constructorType = declaration.declaredFragment!.element.type; + var constructorReturnType = constructorType.returnType; if (!typeSystem.isAssignableTo(redirectedReturnType, constructorReturnType, strictCasts: strictCasts)) { errorReporter.atNode( @@ -3162,8 +3163,8 @@ } // The type of the loop variable. - DartType variableType; - if (variableElement is VariableElement2) { + TypeImpl variableType; + if (variableElement is VariableElementImpl2) { variableType = variableElement.type; } else { return false; @@ -3192,7 +3193,7 @@ return false; } - DartType? sequenceElementType; + TypeImpl? sequenceElementType; { var sequenceElement = awaitKeyword != null ? _typeProvider.streamElement @@ -3935,7 +3936,7 @@ /// the argument value is implicit. /// /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. - void _checkForIntNotAssignable(Expression argument) { + void _checkForIntNotAssignable(ExpressionImpl argument) { var parameterElement = argument.correspondingParameter; var parameterType = parameterElement?.type; if (parameterType != null) { @@ -4178,7 +4179,7 @@ } } - void _checkForMainFunction2(FunctionDeclaration functionDeclaration) { + void _checkForMainFunction2(FunctionDeclarationImpl functionDeclaration) { if (functionDeclaration.name.lexeme != 'main') { return; } @@ -4429,8 +4430,8 @@ /// the [mixinIndex] position in the mixins list are satisfied by the /// [_enclosingClass], or a previous mixin. bool _checkForMixinSuperclassConstraints( - int mixinIndex, NamedType mixinName) { - InterfaceType mixinType = mixinName.type as InterfaceType; + int mixinIndex, NamedTypeImpl mixinName) { + var mixinType = mixinName.type as InterfaceTypeImpl; for (var constraint in mixinType.superclassConstraints) { var superType = _enclosingClass!.supertype as InterfaceTypeImpl; superType = superType.withNullability(NullabilitySuffix.none); @@ -5758,7 +5759,7 @@ return; } var element = parameter.declaredFragment?.element; - if (element is FieldFormalParameterElement2) { + if (element is FieldFormalParameterElementImpl2) { var fieldElement = element.field2; if (fieldElement == null || fieldElement.isSynthetic) { errorReporter.atNode( @@ -5768,9 +5769,9 @@ ); } else { var parameterElement = parameter.declaredFragment?.element; - if (parameterElement is FieldFormalParameterElement2) { - DartType declaredType = parameterElement.type; - DartType fieldType = fieldElement.type; + if (parameterElement is FieldFormalParameterElementImpl2) { + var declaredType = parameterElement.type; + var fieldType = fieldElement.type; if (fieldElement.isSynthetic) { errorReporter.atNode( parameter, @@ -5900,9 +5901,7 @@ void _checkForWrongTypeParameterVarianceInField(FieldDeclaration node) { if (_enclosingClass != null) { for (var typeParameter in _enclosingClass!.asElement.typeParameters) { - // TODO(kallentu): : Clean up TypeParameterElementImpl casting once - // variance is added to the interface. - if (!(typeParameter as TypeParameterElementImpl).isLegacyCovariant) { + if (!typeParameter.isLegacyCovariant) { var fields = node.fields; var fieldElement = fields.variables.first.declaredElement!; var fieldName = fields.variables.first.name; @@ -5930,9 +5929,7 @@ } for (var typeParameter in _enclosingClass!.asElement.typeParameters) { - // TODO(kallentu): : Clean up TypeParameterElementImpl casting once - // variance is added to the interface. - if ((typeParameter as TypeParameterElementImpl).isLegacyCovariant) { + if (typeParameter.isLegacyCovariant) { continue; } @@ -5980,12 +5977,8 @@ void checkOne(DartType? superInterface) { if (superInterface != null) { for (var typeParameter in _enclosingClass!.asElement.typeParameters) { - // TODO(kallentu): : Clean up TypeParameterElementImpl casting once - // variance is added to the interface. - var typeParameterElementImpl = - typeParameter as TypeParameterElementImpl; var superVariance = - typeParameterElementImpl.computeVarianceInType(superInterface); + typeParameter.computeVarianceInType(superInterface); // Let `D` be a class or mixin declaration, let `S` be a direct // superinterface of `D`, and let `X` be a type parameter declared by // `D`. @@ -5995,16 +5988,15 @@ // contravariant or unrelated position. // If `X` is an `inout` type parameter, it can occur in `S` in any // position. - if (!superVariance - .greaterThanOrEqual(typeParameterElementImpl.variance)) { - if (!typeParameterElementImpl.isLegacyCovariant) { + if (!superVariance.greaterThanOrEqual(typeParameter.variance)) { + if (!typeParameter.isLegacyCovariant) { errorReporter.atElement( typeParameter, CompileTimeErrorCode .WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE, arguments: [ typeParameter.name, - typeParameterElementImpl.variance.keyword, + typeParameter.variance.keyword, superVariance.keyword, superInterface, ],
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart index 97a4833..27c4e89 100644 --- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart +++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -118,7 +118,7 @@ {required this.strictCasts}); @override - void visitClassDeclaration(ClassDeclaration node) { + void visitClassDeclaration(covariant ClassDeclarationImpl node) { inCompound = false; compound = null; // Only the Allocator, Opaque and Struct class may be extended. @@ -248,9 +248,10 @@ } @override - void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { + void visitFunctionExpressionInvocation( + covariant FunctionExpressionInvocationImpl node) { var element = node.element; - if (element is MethodElement2) { + if (element is MethodElement2OrMember) { var enclosingElement = element.enclosingElement2; if (enclosingElement.isAllocatorExtension && element.name3 == _allocateExtensionMethodName) { @@ -261,7 +262,7 @@ } @override - void visitIndexExpression(IndexExpression node) { + void visitIndexExpression(covariant IndexExpressionImpl node) { var element = node.element; if (element is MethodElement2) { var enclosingElement = element.enclosingElement2; @@ -334,7 +335,7 @@ @override void visitMethodInvocation(covariant MethodInvocationImpl node) { var element = node.methodName.element; - if (element is MethodElement2) { + if (element is MethodElement2OrMember) { var enclosingElement = element.enclosingElement2; if (enclosingElement.isPointer) { if (element.name3 == 'fromFunction') { @@ -375,7 +376,7 @@ } @override - void visitPrefixedIdentifier(PrefixedIdentifier node) { + void visitPrefixedIdentifier(covariant PrefixedIdentifierImpl node) { var element = node.element; if (element != null) { var enclosingElement = element.enclosingElement2; @@ -394,7 +395,7 @@ } @override - void visitPropertyAccess(PropertyAccess node) { + void visitPropertyAccess(covariant PropertyAccessImpl node) { var element = node.propertyName.element; if (element != null) { var enclosingElement = element.enclosingElement2; @@ -429,7 +430,7 @@ super.visitTopLevelVariableDeclaration(node); } - DartType? _canonicalFfiTypeForDartType(DartType dartType) { + TypeImpl? _canonicalFfiTypeForDartType(TypeImpl dartType) { if (dartType.isPointer || dartType.isCompoundSubtype || dartType.isArray) { return dartType; } else { @@ -550,13 +551,13 @@ Token errorToken, Element2 declarationElement, NodeList<Annotation> metadata, - DartType ffiSignature, + TypeImpl ffiSignature, DartObject annotationValue, bool allowVariableLength, ) { - DartType type; + TypeImpl type; - if (declarationElement is FieldElement2) { + if (declarationElement is FieldElement2OrMember) { if (!declarationElement.isStatic) { _errorReporter.atToken( errorToken, @@ -564,9 +565,9 @@ ); } type = declarationElement.type; - } else if (declarationElement is TopLevelVariableElement2) { + } else if (declarationElement is TopLevelVariableElementImpl2) { type = declarationElement.type; - } else if (declarationElement is PropertyAccessorElement2) { + } else if (declarationElement is PropertyAccessorElement2OrMember) { var variable = declarationElement.variable3; if (variable == null) { return; @@ -628,7 +629,7 @@ void _checkFfiNativeFunction( Token errorToken, - ExecutableElement2 declarationElement, + ExecutableElement2OrMember declarationElement, FunctionTypeImpl ffiSignature, DartObject annotationValue, List<FormalParameter> formalParameters, @@ -815,8 +816,8 @@ /// Validates that the given type is a valid dart:ffi native function /// signature. - bool _isValidFfiNativeFunctionType(DartType nativeType) { - if (nativeType is FunctionType && !nativeType.isDartCoreFunction) { + bool _isValidFfiNativeFunctionType(TypeImpl nativeType) { + if (nativeType is FunctionTypeImpl && !nativeType.isDartCoreFunction) { if (nativeType.namedParameterTypes.isNotEmpty || nativeType.optionalParameterTypes.isNotEmpty) { return false; @@ -826,8 +827,7 @@ return false; } - for (DartType typeArg - in nativeType.normalParameterTypes.flattenVarArgs()) { + for (var typeArg in nativeType.normalParameterTypes.flattenVarArgs()) { if (!_isValidFfiNativeType(typeArg, allowHandle: true)) { return false; } @@ -839,14 +839,14 @@ /// Validates that the given [nativeType] is a valid dart:ffi native type. bool _isValidFfiNativeType( - DartType? nativeType, { + TypeImpl? nativeType, { bool allowVoid = false, bool allowEmptyStruct = false, bool allowArray = false, bool allowHandle = false, bool allowOpaque = false, }) { - if (nativeType is InterfaceType) { + if (nativeType is InterfaceTypeImpl) { var primitiveType = _primitiveNativeType(nativeType); switch (primitiveType) { case _PrimitiveDartType.void_: @@ -899,7 +899,7 @@ if (allowArray && nativeType.isArray) { return _isValidFfiNativeType(nativeType.typeArguments.single); } - } else if (nativeType is FunctionType) { + } else if (nativeType is FunctionTypeImpl) { return _isValidFfiNativeFunctionType(nativeType); } return false; @@ -1166,12 +1166,12 @@ ); } - void _validateAllocate(FunctionExpressionInvocation node) { + void _validateAllocate(FunctionExpressionInvocationImpl node) { var typeArgumentTypes = node.typeArgumentTypes; if (typeArgumentTypes == null || typeArgumentTypes.length != 1) { return; } - DartType dartType = typeArgumentTypes[0]; + var dartType = typeArgumentTypes[0]; if (!_isValidFfiNativeType(dartType, allowVoid: true, allowEmptyStruct: true)) { AstNode errorNode = node; @@ -1234,7 +1234,8 @@ /// Validate the invocation of the instance method /// `Pointer<T>.asFunction<F>()`. - void _validateAsFunction(MethodInvocation node, MethodElement2 element) { + void _validateAsFunction( + covariant MethodInvocationImpl node, MethodElement2OrMember element) { var typeArguments = node.typeArguments?.arguments; AstNode errorNode = typeArguments != null ? typeArguments[0] : node; if (typeArguments != null && typeArguments.length == 1) { @@ -1244,12 +1245,12 @@ } var target = node.realTarget!; var targetType = target.staticType; - if (targetType is InterfaceType && targetType.isPointer) { - DartType T = targetType.typeArguments[0]; + if (targetType is InterfaceTypeImpl && targetType.isPointer) { + var T = targetType.typeArguments[0]; if (!T.isNativeFunction) { return; } - DartType pointerTypeArg = (T as InterfaceType).typeArguments.single; + var pointerTypeArg = (T as InterfaceTypeImpl).typeArguments.single; if (pointerTypeArg is TypeParameterType) { _errorReporter.atNode( target, @@ -1267,8 +1268,8 @@ return; } - DartType TPrime = T.typeArguments[0]; - DartType F = node.typeArgumentTypes![0]; + var TPrime = T.typeArguments[0]; + var F = node.typeArgumentTypes![0]; var isLeaf = _isLeaf(node.argumentList.arguments); if (!_validateCompatibleFunctionTypes( _FfiTypeCheckDirection.nativeToDart, F, TPrime)) { @@ -1291,15 +1292,15 @@ /// types, and subtyping is allowed in either direction. bool _validateCompatibleFunctionTypes( _FfiTypeCheckDirection direction, - DartType dartType, - DartType nativeType, { + TypeImpl dartType, + TypeImpl nativeType, { bool nativeFieldWrappersAsPointer = false, bool permissiveReturnType = false, }) { // We require both to be valid function types. - if (dartType is! FunctionType || + if (dartType is! FunctionTypeImpl || dartType.isDartCoreFunction || - nativeType is! FunctionType || + nativeType is! FunctionTypeImpl || nativeType.isDartCoreFunction) { return false; } @@ -1360,14 +1361,14 @@ /// [_FfiTypeCheckDirection.dartToNative]. bool _validateCompatibleNativeType( _FfiTypeCheckDirection direction, - DartType dartType, - DartType nativeType, { + TypeImpl dartType, + TypeImpl nativeType, { bool nativeFieldWrappersAsPointer = false, bool allowFunctions = false, }) { var nativeReturnType = _primitiveNativeType(nativeType); if (nativeReturnType == _PrimitiveDartType.int || - (nativeType is InterfaceType && + (nativeType is InterfaceTypeImpl && nativeType.superclass?.element3.name3 == _abiSpecificIntegerClassName)) { return dartType.isDartCoreInt; @@ -1390,7 +1391,8 @@ case _FfiTypeCheckDirection.nativeToDart: return typeSystem.isSubtypeOf(typeSystem.objectNone, dartType); } - } else if (dartType is InterfaceType && nativeType is InterfaceType) { + } else if (dartType is InterfaceTypeImpl && + nativeType is InterfaceTypeImpl) { if (nativeFieldWrappersAsPointer && _extendsNativeFieldWrapperClass1(dartType)) { // Must be `Pointer<Void>`, `Handle` already checked above. @@ -1406,9 +1408,9 @@ return direction == _FfiTypeCheckDirection.dartToNative ? typeSystem.isSubtypeOf(dartType, nativeType) : typeSystem.isSubtypeOf(nativeType, dartType); - } else if (dartType is FunctionType && + } else if (dartType is FunctionTypeImpl && allowFunctions && - nativeType is InterfaceType && + nativeType is InterfaceTypeImpl && nativeType.isNativeFunction) { var nativeFunction = nativeType.typeArguments[0]; return _validateCompatibleFunctionTypes( @@ -1421,12 +1423,12 @@ } } - void _validateCreate(MethodInvocation node, String errorClass) { + void _validateCreate(MethodInvocationImpl node, String errorClass) { var typeArgumentTypes = node.typeArgumentTypes; if (typeArgumentTypes == null || typeArgumentTypes.length != 1) { return; } - DartType dartType = typeArgumentTypes[0]; + var dartType = typeArgumentTypes[0]; if (!_isValidFfiNativeType(dartType)) { AstNode errorNode = node; _errorReporter.atNode( @@ -1439,8 +1441,8 @@ void _validateElementAt(MethodInvocation node) { var targetType = node.realTarget?.staticType; - if (targetType is InterfaceType && targetType.isPointer) { - DartType T = targetType.typeArguments[0]; + if (targetType is InterfaceTypeImpl && targetType.isPointer) { + var T = targetType.typeArguments[0]; if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) { AstNode errorNode = node; @@ -1576,7 +1578,8 @@ /// Validate the invocation of the static method /// `Pointer<T>.fromFunction(f, e)`. - void _validateFromFunction(MethodInvocation node, MethodElement2 element) { + void _validateFromFunction( + MethodInvocationImpl node, MethodElement2 element) { int argCount = node.argumentList.arguments.length; if (argCount < 1 || argCount > 2) { // There are other diagnostics reported against the invocation and the @@ -1584,7 +1587,7 @@ return; } - DartType T = node.typeArgumentTypes![0]; + var T = node.typeArgumentTypes![0]; if (!_isValidFfiNativeFunctionType(T)) { AstNode errorNode = node.methodName; var typeArgument = node.typeArguments?.arguments[0]; @@ -1599,8 +1602,8 @@ return; } - Expression f = node.argumentList.arguments[0]; - DartType FT = f.typeOrThrow; + var f = node.argumentList.arguments[0]; + var FT = f.typeOrThrow; if (!_validateCompatibleFunctionTypes( _FfiTypeCheckDirection.dartToNative, FT, T)) { _errorReporter.atNode( @@ -1612,7 +1615,7 @@ } // TODO(brianwilkerson): Validate that `f` is a top-level function. - DartType R = (T as FunctionType).returnType; + var R = (T as FunctionTypeImpl).returnType; if (_primitiveNativeType(R) == _PrimitiveDartType.void_ || R.isPointer || R.isHandle || @@ -1674,7 +1677,7 @@ /// Validate the invocation of the instance method /// `DynamicLibrary.lookupFunction<S, F>()`. - void _validateLookupFunction(MethodInvocation node) { + void _validateLookupFunction(MethodInvocationImpl node) { var typeArguments = node.typeArguments?.arguments; if (typeArguments == null || typeArguments.length != 2) { // There are other diagnostics reported against the invocation and the @@ -1682,9 +1685,9 @@ return; } - List<DartType> argTypes = node.typeArgumentTypes!; - DartType S = argTypes[0]; - DartType F = argTypes[1]; + var argTypes = node.typeArgumentTypes!; + var S = argTypes[0]; + var F = argTypes[1]; if (!_isValidFfiNativeFunctionType(S)) { AstNode errorNode = typeArguments[0]; _errorReporter.atNode( @@ -1744,7 +1747,7 @@ // When referencing a function, the target type must be a // `NativeFunction<T>` so that `T` matches the type from the // annotation. - if (targetType case InterfaceType(isNativeFunction: true)) { + if (targetType case InterfaceTypeImpl(isNativeFunction: true)) { var targetFunctionType = targetType.typeArguments[0]; if (!typeSystem.isEqualTo(nativeType, targetFunctionType)) { _errorReporter.atNode( @@ -1779,7 +1782,7 @@ ); } - if (targetType case InterfaceType(isNativeFunction: true)) { + if (targetType case InterfaceTypeImpl(isNativeFunction: true)) { var targetFunctionType = targetType.typeArguments[0]; if (!typeSystem.isEqualTo(staticType, targetFunctionType)) { _errorReporter.atNode( @@ -1840,6 +1843,8 @@ } var typeArg = (node.staticType as ParameterizedType).typeArguments[0]; + // TODO(scheglov): eliminate this cast + typeArg as TypeImpl; if (!_isValidFfiNativeFunctionType(typeArg)) { _errorReporter.atNode( node.constructorName, @@ -1861,7 +1866,7 @@ return; } - var natRetType = (typeArg as FunctionType).returnType; + var natRetType = (typeArg as FunctionTypeImpl).returnType; if (isolateLocal) { if (_primitiveNativeType(natRetType) == _PrimitiveDartType.void_ || natRetType.isPointer || @@ -1957,8 +1962,8 @@ } } - void _validateRefIndexed(IndexExpression node) { - var targetType = node.realTarget.staticType; + void _validateRefIndexed(IndexExpressionImpl node) { + var targetType = node.realTarget.typeOrThrow; if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true, allowArray: true)) { AstNode errorNode = node; @@ -1972,7 +1977,7 @@ /// Validate the invocation of the extension method /// `Pointer<T extends Struct>.ref`. - void _validateRefPrefixedIdentifier(PrefixedIdentifier node) { + void _validateRefPrefixedIdentifier(PrefixedIdentifierImpl node) { var targetType = node.prefix.staticType; if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) { AstNode errorNode = node; @@ -1984,8 +1989,8 @@ } } - void _validateRefPropertyAccess(PropertyAccess node) { - var targetType = node.realTarget.staticType; + void _validateRefPropertyAccess(PropertyAccessImpl node) { + var targetType = node.realTarget.typeOrThrow; if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) { AstNode errorNode = node; _errorReporter.atNode( @@ -1999,8 +2004,8 @@ /// Validate the invocation of the /// `Pointer<T extends Struct>.refWithFinalizer` and /// `Pointer<T extends Union>.refWithFinalizer` extension methods. - void _validateRefWithFinalizer(MethodInvocation node) { - var targetType = node.realTarget?.staticType; + void _validateRefWithFinalizer(MethodInvocationImpl node) { + var targetType = node.realTarget?.typeOrThrow; if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) { _errorReporter.atNode( node, @@ -2010,12 +2015,12 @@ } } - void _validateSizeOf(MethodInvocation node) { + void _validateSizeOf(MethodInvocationImpl node) { var typeArgumentTypes = node.typeArgumentTypes; if (typeArgumentTypes == null || typeArgumentTypes.length != 1) { return; } - DartType T = typeArgumentTypes[0]; + var T = typeArgumentTypes[0]; if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) { AstNode errorNode = node; _errorReporter.atNode( @@ -2725,7 +2730,7 @@ } } -extension on List<DartType> { +extension on List<TypeImpl> { /// Removes the VarArgs from a DartType list. /// /// ``` @@ -2733,7 +2738,7 @@ /// [Int8, VarArgs<(Int8,)>] -> [Int8, Int8] /// [Int8, VarArgs<(Int8, Int8)>] -> [Int8, Int8, Int8] /// ``` - List<DartType> flattenVarArgs() { + List<TypeImpl> flattenVarArgs() { if (isEmpty) { return this; } @@ -2741,8 +2746,8 @@ if (!last.isVarArgs) { return this; } - var typeArgument = (last as InterfaceType).typeArguments.single; - if (typeArgument is! RecordType) { + var typeArgument = (last as InterfaceTypeImpl).typeArguments.single; + if (typeArgument is! RecordTypeImpl) { return this; } if (typeArgument.namedFields.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart index dc533eb..a1d2199 100644 --- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart +++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -178,7 +178,7 @@ /// same contexttype /// </blockquote> void visitIntegerLiteral(IntegerLiteralImpl node, - {required DartType contextType}) { + {required TypeImpl contextType}) { var strictCasts = _resolver.analysisOptions.strictCasts; if (_typeSystem.isAssignableTo(_typeProvider.intType, contextType, strictCasts: strictCasts) ||
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart index 13eb202..d65d811 100644 --- a/pkg/analyzer/lib/src/summary/format.dart +++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -890,6 +890,9 @@ List<int>? _elementNameParameterIds; List<int>? _elementNameUnitMemberIds; List<int>? _elementUnits; + List<int>? _libFragmentRefTargets; + List<int>? _libFragmentRefUriLengths; + List<int>? _libFragmentRefUriOffsets; int? _nullStringId; List<String>? _strings; List<AnalysisDriverSubtypeBuilder>? _subtypes; @@ -977,6 +980,42 @@ } @override + List<int> get libFragmentRefTargets => _libFragmentRefTargets ??= <int>[]; + + /// Support for indexing `part` and `part of` directives. + /// + /// This is the index into [unitLibraryUris] and [unitUnitUris]. + /// This is the library fragment referenced by the directive. + set libFragmentRefTargets(List<int> value) { + assert(value.every((e) => e >= 0)); + this._libFragmentRefTargets = value; + } + + @override + List<int> get libFragmentRefUriLengths => + _libFragmentRefUriLengths ??= <int>[]; + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + set libFragmentRefUriLengths(List<int> value) { + assert(value.every((e) => e >= 0)); + this._libFragmentRefUriLengths = value; + } + + @override + List<int> get libFragmentRefUriOffsets => + _libFragmentRefUriOffsets ??= <int>[]; + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + set libFragmentRefUriOffsets(List<int> value) { + assert(value.every((e) => e >= 0)); + this._libFragmentRefUriOffsets = value; + } + + @override int get nullStringId => _nullStringId ??= 0; /// Identifier of the null string in [strings]. @@ -1135,6 +1174,9 @@ List<int>? elementNameParameterIds, List<int>? elementNameUnitMemberIds, List<int>? elementUnits, + List<int>? libFragmentRefTargets, + List<int>? libFragmentRefUriLengths, + List<int>? libFragmentRefUriOffsets, int? nullStringId, List<String>? strings, List<AnalysisDriverSubtypeBuilder>? subtypes, @@ -1156,6 +1198,9 @@ _elementNameParameterIds = elementNameParameterIds, _elementNameUnitMemberIds = elementNameUnitMemberIds, _elementUnits = elementUnits, + _libFragmentRefTargets = libFragmentRefTargets, + _libFragmentRefUriLengths = libFragmentRefUriLengths, + _libFragmentRefUriOffsets = libFragmentRefUriOffsets, _nullStringId = nullStringId, _strings = strings, _subtypes = subtypes, @@ -1360,6 +1405,33 @@ signatureSink.addString(x); } } + var libFragmentRefTargets = this._libFragmentRefTargets; + if (libFragmentRefTargets == null) { + signatureSink.addInt(0); + } else { + signatureSink.addInt(libFragmentRefTargets.length); + for (var x in libFragmentRefTargets) { + signatureSink.addInt(x); + } + } + var libFragmentRefUriOffsets = this._libFragmentRefUriOffsets; + if (libFragmentRefUriOffsets == null) { + signatureSink.addInt(0); + } else { + signatureSink.addInt(libFragmentRefUriOffsets.length); + for (var x in libFragmentRefUriOffsets) { + signatureSink.addInt(x); + } + } + var libFragmentRefUriLengths = this._libFragmentRefUriLengths; + if (libFragmentRefUriLengths == null) { + signatureSink.addInt(0); + } else { + signatureSink.addInt(libFragmentRefUriLengths.length); + for (var x in libFragmentRefUriLengths) { + signatureSink.addInt(x); + } + } } typed_data.Uint8List toBuffer() { @@ -1374,6 +1446,9 @@ fb.Offset? offset_elementNameParameterIds; fb.Offset? offset_elementNameUnitMemberIds; fb.Offset? offset_elementUnits; + fb.Offset? offset_libFragmentRefTargets; + fb.Offset? offset_libFragmentRefUriLengths; + fb.Offset? offset_libFragmentRefUriOffsets; fb.Offset? offset_strings; fb.Offset? offset_subtypes; fb.Offset? offset_supertypes; @@ -1419,6 +1494,23 @@ if (!(elementUnits == null || elementUnits.isEmpty)) { offset_elementUnits = fbBuilder.writeListUint32(elementUnits); } + var libFragmentRefTargets = _libFragmentRefTargets; + if (!(libFragmentRefTargets == null || libFragmentRefTargets.isEmpty)) { + offset_libFragmentRefTargets = + fbBuilder.writeListUint32(libFragmentRefTargets); + } + var libFragmentRefUriLengths = _libFragmentRefUriLengths; + if (!(libFragmentRefUriLengths == null || + libFragmentRefUriLengths.isEmpty)) { + offset_libFragmentRefUriLengths = + fbBuilder.writeListUint32(libFragmentRefUriLengths); + } + var libFragmentRefUriOffsets = _libFragmentRefUriOffsets; + if (!(libFragmentRefUriOffsets == null || + libFragmentRefUriOffsets.isEmpty)) { + offset_libFragmentRefUriOffsets = + fbBuilder.writeListUint32(libFragmentRefUriOffsets); + } var strings = _strings; if (!(strings == null || strings.isEmpty)) { offset_strings = fbBuilder @@ -1502,6 +1594,15 @@ if (offset_elementUnits != null) { fbBuilder.addOffset(5, offset_elementUnits); } + if (offset_libFragmentRefTargets != null) { + fbBuilder.addOffset(21, offset_libFragmentRefTargets); + } + if (offset_libFragmentRefUriLengths != null) { + fbBuilder.addOffset(23, offset_libFragmentRefUriLengths); + } + if (offset_libFragmentRefUriOffsets != null) { + fbBuilder.addOffset(22, offset_libFragmentRefUriOffsets); + } fbBuilder.addUint32(1, _nullStringId, 0); if (offset_strings != null) { fbBuilder.addOffset(0, offset_strings); @@ -1577,6 +1678,9 @@ List<int>? _elementNameParameterIds; List<int>? _elementNameUnitMemberIds; List<int>? _elementUnits; + List<int>? _libFragmentRefTargets; + List<int>? _libFragmentRefUriLengths; + List<int>? _libFragmentRefUriOffsets; int? _nullStringId; List<String>? _strings; List<idl.AnalysisDriverSubtype>? _subtypes; @@ -1632,6 +1736,24 @@ } @override + List<int> get libFragmentRefTargets { + return _libFragmentRefTargets ??= const fb.Uint32ListReader() + .vTableGet(_bc, _bcOffset, 21, const <int>[]); + } + + @override + List<int> get libFragmentRefUriLengths { + return _libFragmentRefUriLengths ??= const fb.Uint32ListReader() + .vTableGet(_bc, _bcOffset, 23, const <int>[]); + } + + @override + List<int> get libFragmentRefUriOffsets { + return _libFragmentRefUriOffsets ??= const fb.Uint32ListReader() + .vTableGet(_bc, _bcOffset, 22, const <int>[]); + } + + @override int get nullStringId { return _nullStringId ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0); @@ -1755,6 +1877,18 @@ if (local_elementUnits.isNotEmpty) { result["elementUnits"] = local_elementUnits; } + var local_libFragmentRefTargets = libFragmentRefTargets; + if (local_libFragmentRefTargets.isNotEmpty) { + result["libFragmentRefTargets"] = local_libFragmentRefTargets; + } + var local_libFragmentRefUriLengths = libFragmentRefUriLengths; + if (local_libFragmentRefUriLengths.isNotEmpty) { + result["libFragmentRefUriLengths"] = local_libFragmentRefUriLengths; + } + var local_libFragmentRefUriOffsets = libFragmentRefUriOffsets; + if (local_libFragmentRefUriOffsets.isNotEmpty) { + result["libFragmentRefUriOffsets"] = local_libFragmentRefUriOffsets; + } var local_nullStringId = nullStringId; if (local_nullStringId != 0) { result["nullStringId"] = local_nullStringId; @@ -1831,6 +1965,9 @@ "elementNameParameterIds": elementNameParameterIds, "elementNameUnitMemberIds": elementNameUnitMemberIds, "elementUnits": elementUnits, + "libFragmentRefTargets": libFragmentRefTargets, + "libFragmentRefUriLengths": libFragmentRefUriLengths, + "libFragmentRefUriOffsets": libFragmentRefUriOffsets, "nullStringId": nullStringId, "strings": strings, "subtypes": subtypes,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs index c0941df..f629d13 100644 --- a/pkg/analyzer/lib/src/summary/format.fbs +++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -211,6 +211,22 @@ /// specific unit where the element is declared. elementUnits:[uint] (id: 5); + /// Support for indexing `part` and `part of` directives. + /// + /// This is the index into [unitLibraryUris] and [unitUnitUris]. + /// This is the library fragment referenced by the directive. + libFragmentRefTargets:[uint] (id: 21); + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + libFragmentRefUriLengths:[uint] (id: 23); + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + libFragmentRefUriOffsets:[uint] (id: 22); + /// Identifier of the null string in [strings]. nullStringId:uint (id: 1);
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart index 96d9cfe..b43d540 100644 --- a/pkg/analyzer/lib/src/summary/idl.dart +++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -187,6 +187,25 @@ @Id(5) List<int> get elementUnits; + /// Support for indexing `part` and `part of` directives. + /// + /// This is the index into [unitLibraryUris] and [unitUnitUris]. + /// This is the library fragment referenced by the directive. + @Id(21) + List<int> get libFragmentRefTargets; + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + @Id(23) + List<int> get libFragmentRefUriLengths; + + /// Support for indexing `part` and `part of` directives. + /// + /// The offset of the URI in the directive. + @Id(22) + List<int> get libFragmentRefUriOffsets; + /// Identifier of the null string in [strings]. @Id(1) int get nullStringId;
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart index 1f54c10..55d182e 100644 --- a/pkg/analyzer/lib/src/test_utilities/find_element.dart +++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -6,6 +6,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/test_utilities/function_ast_visitor.dart'; import 'package:analyzer/src/utilities/extensions/element.dart'; @@ -221,7 +222,7 @@ throw StateError('Not found: $name'); } - CompilationUnitElement part(String targetUri) { + CompilationUnitElementImpl part(String targetUri) { CompilationUnitElement? result; for (var partElement in unitElement.parts) { @@ -238,7 +239,7 @@ } if (result != null) { - return result; + return result as CompilationUnitElementImpl; } throw StateError('Not found: $targetUri'); }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element2.dart b/pkg/analyzer/lib/src/test_utilities/find_element2.dart index 2e484a5..78b43a5 100644 --- a/pkg/analyzer/lib/src/test_utilities/find_element2.dart +++ b/pkg/analyzer/lib/src/test_utilities/find_element2.dart
@@ -4,6 +4,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/test_utilities/function_ast_visitor.dart'; import 'package:analyzer/src/utilities/extensions/element.dart'; import 'package:collection/collection.dart'; @@ -479,10 +480,10 @@ return topVar(name).setter2!; } - TopLevelVariableElement2 topVar(String name) { + TopLevelVariableElementImpl2 topVar(String name) { for (var variable in libraryElement.topLevelVariables) { if (variable.name3 == name) { - return variable; + return variable as TopLevelVariableElementImpl2; } } throw StateError('Not found: $name');
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart index e8edfbb..4df71ba 100644 --- a/pkg/analyzer/lib/src/utilities/extensions/element.dart +++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -460,6 +460,16 @@ } } +extension FieldElementOrMemberExtension on FieldElementOrMember { + FieldElement2OrMember get asElement2 { + return switch (this) { + FieldElementImpl(:var element) => element, + FieldMember member => member, + _ => throw UnsupportedError('Unsupported type: $runtimeType'), + }; + } +} + extension FormalParameterElementExtension on FormalParameterElement { ParameterElement get asElement { if (this case ParameterMember member) {
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart index 6a51b9f..4f84398 100644 --- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart +++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -121,13 +121,12 @@ // No code needs to be analyzed but we still need to call // assertNoErrorsInCode to get the typeProvider initialized. await assertNoErrorsInCode(''); - InterfaceType intType = typeProvider.intType; - DartType dynamicType = typeProvider.dynamicType; - InterfaceType futureDynamicType = typeProvider.futureDynamicType; - InterfaceType futureIntType = typeProvider.futureType(intType); - InterfaceType futureFutureDynamicType = - typeProvider.futureType(futureDynamicType); - InterfaceType futureFutureIntType = typeProvider.futureType(futureIntType); + var intType = typeProvider.intType; + var dynamicType = typeProvider.dynamicType; + var futureDynamicType = typeProvider.futureDynamicType; + var futureIntType = typeProvider.futureType(intType); + var futureFutureDynamicType = typeProvider.futureType(futureDynamicType); + var futureFutureIntType = typeProvider.futureType(futureIntType); // flatten(int) = int expect(_flatten(intType), intType); // flatten(dynamic) = dynamic @@ -406,5 +405,5 @@ expect(node.staticType, same(typeProvider.bottomType)); } - TypeImpl _flatten(DartType type) => typeSystem.flatten(type as TypeImpl); + TypeImpl _flatten(TypeImpl type) => typeSystem.flatten(type); }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart index 05870a6..a4cd66b 100644 --- a/pkg/analyzer/test/src/dart/analysis/index_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -7,6 +7,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/src/dart/analysis/index.dart'; +import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/summary/idl.dart'; import 'package:analyzer/src/test_utilities/find_element.dart'; import 'package:analyzer/src/utilities/extensions/element.dart'; @@ -48,6 +49,16 @@ expect(actual, expected); } + void assertLibraryFragmentIndexText( + CompilationUnitElementImpl fragment, String expected) { + var actual = _getLibraryFragmentReferenceText(fragment); + if (actual != expected) { + print(actual); + NodeTextExpectationsCollector.add(actual); + } + expect(actual, expected); + } + test_class_constructorElement_unnamed_implicitInvocation() async { await _indexTestUnit(''' class A { @@ -1068,9 +1079,9 @@ library my_lib; part 'my_unit.dart'; '''); - var element = findElement.part('package:test/my_unit.dart'); - assertElementIndexText(element, r''' -21 2:6 |'my_unit.dart'| IS_REFERENCED_BY qualified + var fragment = findElement.part('package:test/my_unit.dart'); + assertLibraryFragmentIndexText(fragment, r''' +21 2:6 |'my_unit.dart'| '''); } @@ -2728,6 +2739,40 @@ ..isUsed('x();', IndexRelationKind.IS_INVOKED_BY); } + String _getLibraryFragmentReferenceText(CompilationUnitElementImpl target) { + var lineInfo = result.lineInfo; + var targetId = index.getLibraryFragmentId(target); + + expect( + index.libFragmentRefTargets.length, + index.libFragmentRefUriOffsets.length, + ); + + expect( + index.libFragmentRefTargets.length, + index.libFragmentRefUriLengths.length, + ); + + var buffer = StringBuffer(); + for (var i = 0; i < index.libFragmentRefTargets.length; i++) { + if (index.libFragmentRefTargets[i] == targetId) { + var offset = index.libFragmentRefUriOffsets[i]; + var length = index.libFragmentRefUriLengths[i]; + var location = lineInfo.getLocation(offset); + var snippet = result.content.substring(offset, offset + length); + buffer.write(offset); + buffer.write(' '); + buffer.write(location.lineNumber); + buffer.write(':'); + buffer.write(location.columnNumber); + buffer.write(' '); + buffer.write('|$snippet|'); + buffer.writeln(); + } + } + return buffer.toString(); + } + String _getRelationsText(Element element) { var lineInfo = result.lineInfo; var elementId = _findElementId(element); @@ -2832,7 +2877,7 @@ void _assertUsedName(String name, IndexRelationKind kind, ExpectedLocation expectedLocation, bool isNot) { - int nameId = _getStringId(name); + int nameId = index.getStringId(name); for (int i = 0; i < index.usedNames.length; i++) { if (index.usedNames[i] == nameId && index.usedNameKinds[i] == kind && @@ -2883,14 +2928,14 @@ var unitId = _getUnitId(element); // Prepare the element that was put into the index. - IndexElementInfo info = IndexElementInfo(element); - element = info.element; + IndexElementInfo info = IndexElementInfo(element.asElement2!); + element = info.element.asElement!; // Prepare element's name components. - var components = ElementNameComponents(element); - var unitMemberId = _getStringId(components.unitMemberName); - var classMemberId = _getStringId(components.classMemberName); - var parameterId = _getStringId(components.parameterName); + var components = ElementNameComponents(element.asElement2!); + var unitMemberId = index.getStringId(components.unitMemberName); + var classMemberId = index.getStringId(components.classMemberName); + var parameterId = index.getStringId(components.parameterName); // Find the element's id. for (int elementId = 0; @@ -2908,36 +2953,9 @@ return 0; } - int _getStringId(String? str) { - if (str == null) { - return index.nullStringId; - } - - int id = index.strings.indexOf(str); - if (id < 0) { - _failWithIndexDump('String "$str" is not referenced'); - } - return id; - } - int _getUnitId(Element element) { - CompilationUnitElement unitElement = getUnitElement(element); - int libraryUriId = _getUriId(unitElement.library.source.uri); - int unitUriId = _getUriId(unitElement.source.uri); - expect(index.unitLibraryUris, hasLength(index.unitUnitUris.length)); - for (int i = 0; i < index.unitLibraryUris.length; i++) { - if (index.unitLibraryUris[i] == libraryUriId && - index.unitUnitUris[i] == unitUriId) { - return i; - } - } - _failWithIndexDump('Unit $unitElement of $element is not referenced'); - return -1; - } - - int _getUriId(Uri uri) { - String str = uri.toString(); - return _getStringId(str); + var unitElement = getUnitElement(element.asElement2!); + return index.getLibraryFragmentId(unitElement); } Future<void> _indexTestUnit(String code) async {
diff --git a/pkg/analyzer/test/src/dart/element/assignable_test.dart b/pkg/analyzer/test/src/dart/element/assignable_test.dart index 45afa00..239626b 100644 --- a/pkg/analyzer/test/src/dart/element/assignable_test.dart +++ b/pkg/analyzer/test/src/dart/element/assignable_test.dart
@@ -2,7 +2,7 @@ // 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/element/type.dart'; +import 'package:analyzer/src/dart/element/type.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -18,12 +18,12 @@ class IsAssignableToTest extends AbstractTypeSystemTest { bool get strictCasts => analysisContext.analysisOptions.strictCasts; - void isAssignable(DartType from, DartType to) { + void isAssignable(TypeImpl from, TypeImpl to) { expect( typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isTrue); } - void isNotAssignable(DartType from, DartType to) { + void isNotAssignable(TypeImpl from, TypeImpl to) { expect( typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isFalse); }
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart index 8a49210..d72b6db 100644 --- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart +++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -107,6 +107,11 @@ argument: _ArgumentIndex(1), ), _AssertMethod( + className: 'IndexTest', + methodName: 'assertLibraryFragmentIndexText', + argument: _ArgumentIndex(1), + ), + _AssertMethod( className: '_InheritanceManager3Base2', methodName: 'assertInterfaceText', argument: _ArgumentIndex(1),
diff --git a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart index 60e1ad3d..c3877d0 100644 --- a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart +++ b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
@@ -32,6 +32,18 @@ ]); } + test_dotShorthands_disabled() async { + await assertErrorsInCode(r''' +void main() { + Object c = .hash; + print(c); +} +''', [ + error(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 27, 1), + error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 28, 4), + ]); + } + test_nonFunctionTypeAliases_disabled() async { await assertErrorsInCode(r''' // @dart = 2.12
diff --git a/pkg/dart_service_protocol_shared/CHANGELOG.md b/pkg/dart_service_protocol_shared/CHANGELOG.md index 06ff0ad..3177fff 100644 --- a/pkg/dart_service_protocol_shared/CHANGELOG.md +++ b/pkg/dart_service_protocol_shared/CHANGELOG.md
@@ -1,3 +1,6 @@ +## 0.0.3-wip +- Update sdk constraint to '^3.5.0' + ## 0.0.2 - Fixed an issue with streamNotify data type being too specific.
diff --git a/pkg/dart_service_protocol_shared/pubspec.yaml b/pkg/dart_service_protocol_shared/pubspec.yaml index f42883d..6713501 100644 --- a/pkg/dart_service_protocol_shared/pubspec.yaml +++ b/pkg/dart_service_protocol_shared/pubspec.yaml
@@ -1,11 +1,11 @@ name: dart_service_protocol_shared description: A package that implements service extensions and stream managers. -version: 0.0.2 +version: 0.0.3-wip repository: https://github.com/dart-lang/sdk/tree/main/pkg/dart_service_protocol_shared environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ^3.5.0 dependencies: meta: ^1.11.0
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md index 89c1eac..8cef292 100644 --- a/pkg/dds/CHANGELOG.md +++ b/pkg/dds/CHANGELOG.md
@@ -1,6 +1,7 @@ # 5.0.1-wip - Widen the dependency on `package:shelf_web_socket`. +- Require Dart SDK v. 3.5.0 or higher. # 5.0.0 - [DAP] The debug adapter no longer spawns its own in-process copy of DDS, instead relying on one started by the Dart VM (or `Flutter`). This means the `enableDds` and `enableAuthCodes` arguments to the `DartDebugAdapter` base class have been deprecated and have any effect. Suppressing DDS (or auth codes) should be done in launch configuration (for example using `vmAdditionalArgs` or `toolArgs` depending on the target tool).
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart index 34ee2a8..7c2ba66 100644 --- a/pkg/dds/lib/src/dds_impl.dart +++ b/pkg/dds/lib/src/dds_impl.dart
@@ -388,7 +388,7 @@ // If DDS is serving DevTools, install the DevTools handlers and // forward any unhandled HTTP requests to the VM service. final String buildDir = - _devToolsConfiguration!.customBuildDirectoryPath.toFilePath(); + _devToolsConfiguration.customBuildDirectoryPath.toFilePath(); return defaultHandler( dds: this, buildDir: buildDir,
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml index 93b01eb..a321f02 100644 --- a/pkg/dds/pubspec.yaml +++ b/pkg/dds/pubspec.yaml
@@ -6,7 +6,8 @@ repository: https://github.com/dart-lang/sdk/tree/main/pkg/dds environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ^3.5.0 + dependencies: args: ^2.0.0
diff --git a/pkg/dds_service_extensions/CHANGELOG.md b/pkg/dds_service_extensions/CHANGELOG.md index f850800..019258b 100644 --- a/pkg/dds_service_extensions/CHANGELOG.md +++ b/pkg/dds_service_extensions/CHANGELOG.md
@@ -1,3 +1,6 @@ +# 2.0.2-wip +- Require dart sdk v. 3.5.0 or higher. + # 2.0.1 - Update `vm_service` to `>=14.0.0 <16.0.0`.
diff --git a/pkg/dds_service_extensions/pubspec.yaml b/pkg/dds_service_extensions/pubspec.yaml index b4d87b8..ecbe5fb 100644 --- a/pkg/dds_service_extensions/pubspec.yaml +++ b/pkg/dds_service_extensions/pubspec.yaml
@@ -1,12 +1,13 @@ name: dds_service_extensions -version: 2.0.1 +version: 2.0.2-wip description: >- Extension methods for `package:vm_service`, used to make requests a Dart Development Service (DDS) instance. repository: https://github.com/dart-lang/sdk/tree/main/pkg/dds_service_extensions environment: - sdk: ^3.0.0 + sdk: ^3.5.0 + dependencies: async: ^2.4.1
diff --git a/pkg/dtd/CHANGELOG.md b/pkg/dtd/CHANGELOG.md index e2468a1..9a137e5 100644 --- a/pkg/dtd/CHANGELOG.md +++ b/pkg/dtd/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 2.4.1-wip + +- Update SDK constraints to `^3.5.0`. + ## 2.4.0 - Bump `unified_analytics` dependency to ^7.0.0.
diff --git a/pkg/dtd/pubspec.yaml b/pkg/dtd/pubspec.yaml index 806f085..5c17757 100644 --- a/pkg/dtd/pubspec.yaml +++ b/pkg/dtd/pubspec.yaml
@@ -4,7 +4,7 @@ repository: https://github.com/dart-lang/sdk/tree/main/pkg/dtd environment: - sdk: ^3.0.0 + sdk: ^3.5.0 dependencies: json_rpc_2: ^3.0.2
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 323fff8..afd040a 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -10007,15 +10007,13 @@ // Recovery, avoid crashing with an extra selector. pop(); + push(new ParserErrorGenerator(this, token, cfe.messageSyntheticToken)); return; } - Object? selector = pop(); - if (libraryFeatures.dotShorthands.isEnabled && selector is Selector) { - // TODO(kallentu): Remove this once we have more of the dot shorthands - // implementation complete. - pop(); // ParserGeneratorError - + assert(checkState(token, [ValueKinds.Selector])); + Selector selector = pop() as Selector; + if (libraryFeatures.dotShorthands.isEnabled) { // TODO(kallentu): Handle invocations. push(forest.createDotShorthandPropertyGet(
diff --git a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect index 868d2ce..cf6c348 100644 --- a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect +++ b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.expect
@@ -1,9 +1,3 @@ -Problems reported: - -parser/dot_shorthands/syntax:4:13: Expected an identifier, but got '.'. - Color c = .red; - ^ - beginCompilationUnit(enum) beginMetadataStar(enum) endMetadataStar(0) @@ -67,11 +61,6 @@ handleIdentifier(c, localVariableDeclaration) beginInitializedIdentifier(c) beginVariableInitializer(=) - handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '.'., Try inserting an identifier before '.'., {lexeme: .}], ., .) - handleIdentifier(, expression) - handleNoTypeArguments(.) - handleNoArguments(.) - handleSend(, ) handleIdentifier(red, expressionContinuation) handleNoTypeArguments(;) handleNoArguments(;)
diff --git a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect index 2bae6f3..7f6ba63 100644 --- a/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect +++ b/pkg/front_end/parser_testcases/dot_shorthands/syntax.dart.intertwined.expect
@@ -104,19 +104,7 @@ listener: beginVariableInitializer(=) parseExpression(=) parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none) - parseUnaryExpression(=, true, ConstantPatternContext.none) - parsePrimary(=, expression, ConstantPatternContext.none) - parseSend(=, expression, ConstantPatternContext.none) - isNextIdentifier(=) - ensureIdentifier(=, expression) - reportRecoverableErrorWithToken(., Template(ExpectedIdentifier)) - listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got '.'., Try inserting an identifier before '.'., {lexeme: .}], ., .) - rewriter() - listener: handleIdentifier(, expression) - listener: handleNoTypeArguments(.) - parseArgumentsOpt() - listener: handleNoArguments(.) - listener: handleSend(, ) + rewriter() parsePrimary(., expressionContinuation, ConstantPatternContext.none) parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none) parseSend(., expressionContinuation, ConstantPatternContext.none)
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect index a02b6ea..174f17d 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect index a02b6ea..174f17d 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.modular.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect index a02b6ea..174f17d 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_class.dart.strong.transformed.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_class.dart:12:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect index 072b755..f609152 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect index 072b755..f609152 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.modular.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect index 072b755..f609152 100644 --- a/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/dot_shorthands/simple_enum.dart.strong.transformed.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/simple_enum.dart:8:13: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Color c = .red; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect index 0849169..be66ea0 100644 --- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect +++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Object o = .hash; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect index 0849169..be66ea0 100644 --- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect +++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.modular.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Object o = .hash; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect index 0849169..be66ea0 100644 --- a/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/dot_shorthands/tearoff.dart.strong.transformed.expect
@@ -1,12 +1,4 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/dot_shorthands/tearoff.dart:6:14: Error: Expected an identifier, but got '.'. -// Try inserting an identifier before '.'. -// Object o = .hash; -// ^ -// import self as self; import "dart:core" as core;
diff --git a/pkg/linter/lib/src/rules/strict_top_level_inference.dart b/pkg/linter/lib/src/rules/strict_top_level_inference.dart index 1b8be78..8008fd9 100644 --- a/pkg/linter/lib/src/rules/strict_top_level_inference.dart +++ b/pkg/linter/lib/src/rules/strict_top_level_inference.dart
@@ -214,7 +214,9 @@ ); if (overriddenMember == null && node.returnType == null && - !container.isReflectiveTest) { + (!container.isReflectiveTest || + (!node.name.lexeme.startsWith('test_') && + !node.name.lexeme.startsWith('solo_test_')))) { _report(node.name); } if (node.parameters case var parameters?) {
diff --git a/pkg/linter/test/rules/strict_top_level_inference_test.dart b/pkg/linter/test/rules/strict_top_level_inference_test.dart index 3944549..d7843c2 100644 --- a/pkg/linter/test/rules/strict_top_level_inference_test.dart +++ b/pkg/linter/test/rules/strict_top_level_inference_test.dart
@@ -24,6 +24,25 @@ @override String get lintRule => LintNames.strict_top_level_inference; + void addReflectiveTestLoaderDep() { + // TODO(pq): share setup logic with unreachable_from_main_test + var testReflectiveLoaderPath = '$workspaceRootPath/test_reflective_loader'; + var packageConfigBuilder = PackageConfigFileBuilder(); + packageConfigBuilder.add( + name: 'test_reflective_loader', + rootPath: testReflectiveLoaderPath, + ); + writeTestPackageConfig(packageConfigBuilder); + newFile('$testReflectiveLoaderPath/lib/test_reflective_loader.dart', r''' +library test_reflective_loader; + +const Object reflectiveTest = _ReflectiveTest(); +class _ReflectiveTest { + const _ReflectiveTest(); +} +'''); + } + test_constructorParameter_named() async { await assertDiagnostics( r''' @@ -683,23 +702,35 @@ '''); } - test_reflectiveTest() async { - // TODO(pq): share setup logic with unreachable_from_main_test - var testReflectiveLoaderPath = '$workspaceRootPath/test_reflective_loader'; - var packageConfigBuilder = PackageConfigFileBuilder(); - packageConfigBuilder.add( - name: 'test_reflective_loader', - rootPath: testReflectiveLoaderPath, - ); - writeTestPackageConfig(packageConfigBuilder); - newFile('$testReflectiveLoaderPath/lib/test_reflective_loader.dart', r''' -library test_reflective_loader; + test_reflectiveTest_nonTest() async { + addReflectiveTestLoaderDep(); + await assertDiagnostics( + r''' +import 'package:test_reflective_loader/test_reflective_loader.dart'; -const Object reflectiveTest = _ReflectiveTest(); -class _ReflectiveTest { - const _ReflectiveTest(); +@reflectiveTest +class ReflectiveTest { + foo() {} +} +''', + [lint(111, 3)], + ); + } + + test_reflectiveTest_soloTest() async { + addReflectiveTestLoaderDep(); + await assertNoDiagnostics(r''' +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +@reflectiveTest +class ReflectiveTest { + solo_test_foo() {} } '''); + } + + test_reflectiveTest_test() async { + addReflectiveTestLoaderDep(); await assertNoDiagnostics(r''' import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md index 01afccd..1ad73eb 100644 --- a/pkg/native_stack_traces/CHANGELOG.md +++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,3 +1,6 @@ +## 0.6.1-wip +- Update SDK constraint to `^3.5.0`. + ## 0.6.0 - Make return type of DwarfContainer reader methods nullable so null can be returned if there is no relevant DWARF information.
diff --git a/pkg/native_stack_traces/lib/src/convert.dart b/pkg/native_stack_traces/lib/src/convert.dart index a824160..3a22e98 100644 --- a/pkg/native_stack_traces/lib/src/convert.dart +++ b/pkg/native_stack_traces/lib/src/convert.dart
@@ -562,12 +562,12 @@ Dwarf? unitDwarf; // Prefer the map that specifies loading unit IDs over the iterable. if (_dwarfByUnitId != null) { - unitDwarf = _dwarfByUnitId![unitId]; + unitDwarf = _dwarfByUnitId[unitId]; } if (unitDwarf == null && _unitDwarfs != null && offset.buildId != null) { - for (final d in _unitDwarfs!) { + for (final d in _unitDwarfs) { if (d.buildId(offset.architecture) == offset.buildId) { unitDwarf = d; }
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml index 8b75fa9..4c2ef7b 100644 --- a/pkg/native_stack_traces/pubspec.yaml +++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,10 +1,10 @@ name: native_stack_traces -version: 0.6.0 +version: 0.6.1-wip description: Utilities for working with non-symbolic stack traces. repository: https://github.com/dart-lang/sdk/tree/main/pkg/native_stack_traces environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ^3.5.0 executables: decode:
diff --git a/pkg/record_use/CHANGELOG.md b/pkg/record_use/CHANGELOG.md index 631d73c..cfd2549 100644 --- a/pkg/record_use/CHANGELOG.md +++ b/pkg/record_use/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 0.3.1-wip + +- Update SDK constraint to `^3.5.0`. + ## 0.3.0 - Make `InstanceConstant` a `Constant`.
diff --git a/pkg/record_use/pubspec.yaml b/pkg/record_use/pubspec.yaml index 7633421..043bcdb 100644 --- a/pkg/record_use/pubspec.yaml +++ b/pkg/record_use/pubspec.yaml
@@ -1,11 +1,11 @@ name: record_use description: > The serialization logic and API for the usage recording SDK feature. -version: 0.3.0 +version: 0.3.1-wip repository: https://github.com/dart-lang/sdk/tree/main/pkg/record_use environment: - sdk: ^3.4.0 + sdk: ^3.5.0 dependencies: collection: ^1.18.0
diff --git a/tests/language/dot_shorthands/feature_disabled_error_test.dart b/tests/language/dot_shorthands/feature_disabled_error_test.dart index 661a814..c1a565c 100644 --- a/tests/language/dot_shorthands/feature_disabled_error_test.dart +++ b/tests/language/dot_shorthands/feature_disabled_error_test.dart
@@ -12,7 +12,7 @@ Color color = .blue; // ^ // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED - // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER - // [cfe] Expected an identifier, but got '.'. // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled. + // ^^^^ + // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER }
diff --git a/tests/language/dot_shorthands/feature_enabled_error_test.dart b/tests/language/dot_shorthands/feature_enabled_error_test.dart index 3f3a5fc..8dee8be 100644 --- a/tests/language/dot_shorthands/feature_enabled_error_test.dart +++ b/tests/language/dot_shorthands/feature_enabled_error_test.dart
@@ -11,7 +11,7 @@ Color color = .blue; // ^ // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED - // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER - // [cfe] Expected an identifier, but got '.'. // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled. + // ^^^^ + // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER }
diff --git a/tests/language/explicit_type_instantiation_parsing_test.dart b/tests/language/explicit_type_instantiation_parsing_test.dart index 85f185d..ddc2a64 100644 --- a/tests/language/explicit_type_instantiation_parsing_test.dart +++ b/tests/language/explicit_type_instantiation_parsing_test.dart
@@ -249,9 +249,9 @@ // [cfe] A comparison expression can't be an operand of another comparison expression. // ^ // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED - // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER - // [cfe] Expected an identifier, but got '.'. // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled. + // ^^^^^^^^ + // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER X<2>.any; // ^ @@ -259,9 +259,9 @@ // [cfe] A comparison expression can't be an operand of another comparison expression. // ^ // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED - // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER - // [cfe] Expected an identifier, but got '.'. // [cfe] This requires the experimental 'dot-shorthands' language feature to be enabled. + // ^^^ + // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER // This would be invalid even if `X` had an `any` member. See next. X<X>.any; // Invalid, Class does not have any static `any` member.
diff --git a/tools/VERSION b/tools/VERSION index 23200c0..2c090d5 100644 --- a/tools/VERSION +++ b/tools/VERSION
@@ -27,5 +27,5 @@ MAJOR 3 MINOR 8 PATCH 0 -PRERELEASE 150 +PRERELEASE 151 PRERELEASE_PATCH 0