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