Version 2.18.0-255.0.dev

Merge commit '9d1b978319201aef88741b1a1c5aa8441d56b2cd' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 7983d90..dc66628 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -48,6 +48,7 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:collection/collection.dart';
 
 class AnalysisForCompletionResult {
   final CompilationUnit parsedUnit;
@@ -271,11 +272,19 @@
     }
 
     if (_analysisOptions.lint) {
-      var allUnits = _library.files
-          .map((file) => LinterContextUnit(file.content, units[file]!))
+      final allUnits = _library.files
+          .map((file) {
+            final unit = units[file];
+            if (unit != null) {
+              return LinterContextUnit2(file, unit);
+            } else {
+              return null;
+            }
+          })
+          .whereNotNull()
           .toList();
-      for (int i = 0; i < allUnits.length; i++) {
-        _computeLints(_library.files[i], allUnits[i], allUnits,
+      for (final linterUnit in allUnits) {
+        _computeLints(linterUnit.file, linterUnit, allUnits,
             analysisOptions: _analysisOptions);
       }
     }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 6d5ea0d..275cde4 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart' as file_system;
+import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/constant/compute.dart';
@@ -512,6 +513,21 @@
   LinterContextUnit(this.content, this.unit);
 }
 
+/// TODO(scheglov) This class exists only because there are places in the
+/// analyzer and analysis server that instantiate [LinterContextUnit]. This
+/// should not happen, and should be fixed.
+class LinterContextUnit2 implements LinterContextUnit {
+  final FileState file;
+
+  @override
+  final CompilationUnit unit;
+
+  LinterContextUnit2(this.file, this.unit);
+
+  @override
+  String get content => file.content;
+}
+
 /// Thrown when an error occurs in linting.
 class LinterException implements Exception {
   /// A message describing the error.
diff --git a/pkg/analyzer/lib/src/summary2/macro_application.dart b/pkg/analyzer/lib/src/summary2/macro_application.dart
index 3870b8e..8260593 100644
--- a/pkg/analyzer/lib/src/summary2/macro_application.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_application.dart
@@ -33,7 +33,7 @@
       _IdentifierResolver(_linker.elementFactory, declarationBuilder);
 
   late final macro.TypeDeclarationResolver _typeDeclarationResolver =
-      _TypeDeclarationResolver();
+      _TypeDeclarationResolver(declarationBuilder);
 
   late final macro.TypeIntrospector _typeIntrospector =
       _TypeIntrospector(declarationBuilder);
@@ -570,11 +570,20 @@
 }
 
 class _TypeDeclarationResolver implements macro.TypeDeclarationResolver {
+  final DeclarationBuilder declarationBuilder;
+
+  _TypeDeclarationResolver(this.declarationBuilder);
+
   @override
   Future<macro.TypeDeclaration> declarationOf(
-      covariant macro.Identifier identifier) {
-    // TODO: implement declarationOf
-    throw UnimplementedError();
+    covariant IdentifierImpl identifier,
+  ) async {
+    final element = identifier.element;
+    if (element is ClassElementImpl) {
+      return declarationBuilder.fromElement.classElement(element);
+    } else {
+      throw ArgumentError('element: $element');
+    }
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/macro_declarations.dart b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
index 96d2711..bfe0b62 100644
--- a/pkg/analyzer/lib/src/summary2/macro_declarations.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
@@ -36,11 +36,11 @@
   /// corresponding elements. So, we can access them uniformly via interfaces,
   /// mixins, etc.
   void transferToElements() {
+    // TODO(scheglov) Make sure that these are only declarations?
     for (final entry in fromNode._identifierMap.entries) {
       final element = entry.key.staticElement;
       if (element != null) {
         final declaration = entry.value;
-        declaration.element = element;
         fromElement._identifierMap[element] = declaration;
       }
     }
@@ -74,10 +74,11 @@
   }
 
   macro.IdentifierImpl identifier(Element element) {
-    return _identifierMap[element] ??= IdentifierImpl(
+    return _identifierMap[element] ??= IdentifierImplFromElement(
       id: macro.RemoteInstance.uniqueId,
       name: element.name!,
-    )..element = element;
+      element: element,
+    );
   }
 
   macro.TypeParameterDeclarationImpl typeParameter(
@@ -198,9 +199,10 @@
     } else {
       simpleIdentifier = (node as ast.PrefixedIdentifier).identifier;
     }
-    return _identifierMap[simpleIdentifier] ??= IdentifierImpl(
+    return _identifierMap[simpleIdentifier] ??= IdentifierImplFromNode(
       id: macro.RemoteInstance.uniqueId,
       name: simpleIdentifier.name,
+      node: simpleIdentifier,
     );
   }
 
@@ -300,10 +302,37 @@
   });
 }
 
-class IdentifierImpl extends macro.IdentifierImpl {
-  late final Element? element;
+abstract class IdentifierImpl extends macro.IdentifierImpl {
+  IdentifierImpl({
+    required super.id,
+    required super.name,
+  });
 
-  IdentifierImpl({required super.id, required super.name});
+  Element? get element;
+}
+
+class IdentifierImplFromElement extends IdentifierImpl {
+  @override
+  final Element element;
+
+  IdentifierImplFromElement({
+    required super.id,
+    required super.name,
+    required this.element,
+  });
+}
+
+class IdentifierImplFromNode extends IdentifierImpl {
+  final ast.SimpleIdentifier node;
+
+  IdentifierImplFromNode({
+    required super.id,
+    required super.name,
+    required this.node,
+  });
+
+  @override
+  Element? get element => node.staticElement;
 }
 
 class IntrospectableClassDeclarationImpl
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index adf42bb..0d9b911 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:linter/src/rules.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -104,6 +105,12 @@
 
 @reflectiveTest
 class AnalysisDriver_PubPackageTest extends PubPackageResolutionTest {
+  @override
+  void setUp() {
+    super.setUp();
+    registerLintRules();
+  }
+
   test_getLibraryByUri_cannotResolveUri() async {
     final driver = driverFor(testFile.path);
     expect(
@@ -229,6 +236,76 @@
       isA<NotLibraryButPartResult>(),
     );
   }
+
+  test_getResult_part_doesNotExist_lints() async {
+    newFile('$testPackageRootPath/analysis_options.yaml', r'''
+linter:
+  rules:
+    - omit_local_variable_types
+''');
+
+    await assertErrorsInCode(r'''
+library my.lib;
+part 'a.dart';
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 21, 8),
+    ]);
+  }
+
+  test_getResult_part_empty_lints() async {
+    newFile('$testPackageRootPath/analysis_options.yaml', r'''
+linter:
+  rules:
+    - omit_local_variable_types
+''');
+
+    newFile('$testPackageLibPath/a.dart', '');
+
+    await assertErrorsInCode(r'''
+library my.lib;
+part 'a.dart';
+''', [
+      error(CompileTimeErrorCode.PART_OF_NON_PART, 21, 8),
+    ]);
+  }
+
+  test_getResult_part_hasPartOfName_notThisLibrary_lints() async {
+    newFile('$testPackageRootPath/analysis_options.yaml', r'''
+linter:
+  rules:
+    - omit_local_variable_types
+''');
+
+    newFile('$testPackageLibPath/a.dart', r'''
+part of other.lib;
+''');
+
+    await assertErrorsInCode(r'''
+library my.lib;
+part 'a.dart';
+''', [
+      error(CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY, 21, 8),
+    ]);
+  }
+
+  test_getResult_part_hasPartOfUri_notThisLibrary_lints() async {
+    newFile('$testPackageRootPath/analysis_options.yaml', r'''
+linter:
+  rules:
+    - omit_local_variable_types
+''');
+
+    newFile('$testPackageLibPath/a.dart', r'''
+part of 'not_test.dart';
+''');
+
+    await assertErrorsInCode(r'''
+library my.lib;
+part 'a.dart';
+''', [
+      error(CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY, 21, 8),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/summary/macro/introspect_declarations_phase.dart b/pkg/analyzer/test/src/summary/macro/introspect_declarations_phase.dart
index 40a5d33..a9a35af 100644
--- a/pkg/analyzer/test/src/summary/macro/introspect_declarations_phase.dart
+++ b/pkg/analyzer/test/src/summary/macro/introspect_declarations_phase.dart
@@ -78,13 +78,19 @@
     }
 
     await _withIndent(() async {
-      final superclass = e.superclass == null
-          ? null
-          : await typeDeclarationResolver.declarationOf(
-              e.superclass!.identifier) as IntrospectableClassDeclaration;
-      if (superclass != null) {
+      final superAnnotation = e.superclass;
+      if (superAnnotation != null) {
+        final superIdentifier = superAnnotation.identifier;
         _writelnWithIndent('superclass');
-        await _withIndent(() => writeClassDeclaration(superclass));
+        try {
+          final superDeclaration = await typeDeclarationResolver
+              .declarationOf(superIdentifier) as IntrospectableClassDeclaration;
+          await _withIndent(() => writeClassDeclaration(superDeclaration));
+        } on ArgumentError {
+          await _withIndent(() async {
+            _writelnWithIndent('notType ${superIdentifier.name}');
+          });
+        }
       }
 
       await _writeTypeParameters(e.typeParameters);
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index b6deb4c..0f417e7 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -1210,7 +1210,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_imported_interfaces() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {}
@@ -1235,7 +1234,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_imported_isAbstract() async {
     newFile('$testPackageLibPath/a.dart', r'''
 abstract class A {}
@@ -1255,7 +1253,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_imported_mixins() async {
     newFile('$testPackageLibPath/a.dart', r'''
 mixin M1 {}
@@ -1280,7 +1277,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_imported_superclass() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {}
@@ -1303,7 +1299,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_imported_typeParameters() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A<T, U extends List<T>> {}
@@ -1327,7 +1322,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_superclassOf() async {
     await _assertIntrospectDeclarationsText(r'''
 class A {}
@@ -1343,19 +1337,15 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_superclassOf_implicit() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacro
 class X {}
 ''', r'''
 class X
-  superclass
-    class Object
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_ClassDeclaration_superclassOf_unresolved() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacro
@@ -1363,11 +1353,10 @@
 ''', r'''
 class X
   superclass
-    class Object
+    notType A
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_FieldDeclaration_isExternal() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacroX
@@ -1377,8 +1366,6 @@
 }
 ''', r'''
 class X
-  superclass
-    class Object
   fields
     external a
       type: int
@@ -1387,7 +1374,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_FieldDeclaration_isFinal() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacroX
@@ -1397,8 +1383,6 @@
 }
 ''', r'''
 class X
-  superclass
-    class Object
   fields
     final a
       type: int
@@ -1407,7 +1391,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_FieldDeclaration_isLate() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacroX
@@ -1417,8 +1400,6 @@
 }
 ''', r'''
 class X
-  superclass
-    class Object
   fields
     late final a
       type: int
@@ -1427,7 +1408,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_FieldDeclaration_isStatic() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacroX
@@ -1437,8 +1417,6 @@
 }
 ''', r'''
 class X
-  superclass
-    class Object
   fields
     static a
       type: int
@@ -1447,7 +1425,6 @@
 ''');
   }
 
-  @failingTest
   test_introspect_declarations_FieldDeclaration_type_explicit() async {
     await _assertIntrospectDeclarationsText(r'''
 @introspectMacroX
@@ -1457,8 +1434,6 @@
 }
 ''', r'''
 class X
-  superclass
-    class Object
   fields
     a
       type: int
diff --git a/tools/VERSION b/tools/VERSION
index 5c1c3ff..830b50c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 254
+PRERELEASE 255
 PRERELEASE_PATCH 0
\ No newline at end of file