Skip to content

Commit a9905e9

Browse files
pqCommit Queue
authored and
Commit Queue
committed
don't report prefer_const_constructors_in_immutables on macro constructors
Fixes: https://github.com/dart-lang/linter/issues/4966 Change-Id: I4aee65dc62df509833796100ca6f86b904fc72ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365860 Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent 57f57db commit a9905e9

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

pkg/linter/lib/src/extensions.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/dart/element/type.dart';
99
import 'package:analyzer/file_system/physical_file_system.dart';
1010
import 'package:analyzer/src/dart/ast/ast.dart'; // ignore: implementation_imports
11+
import 'package:analyzer/src/dart/element/element.dart'; // ignore: implementation_imports
1112
import 'package:analyzer/src/dart/element/member.dart'; // ignore: implementation_imports
12-
// ignore: implementation_imports
13-
import 'package:analyzer/src/dart/element/type.dart' show InvalidTypeImpl;
13+
import 'package:analyzer/src/dart/element/type.dart' // ignore: implementation_imports
14+
show
15+
InvalidTypeImpl;
1416
import 'package:collection/collection.dart';
1517

1618
import 'analyzer.dart';
@@ -337,6 +339,11 @@ extension ElementExtension on Element {
337339
}
338340
return self;
339341
}
342+
343+
bool get isMacro {
344+
var self = this;
345+
return self is ClassElementImpl && self.isMacro;
346+
}
340347
}
341348

342349
extension ExpressionExtension on Expression? {

pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/src/lint/linter.dart'; // ignore: implementation_import
99
import 'package:collection/collection.dart' show IterableExtension;
1010

1111
import '../analyzer.dart';
12+
import '../extensions.dart';
1213

1314
const _desc = r'Prefer declaring `const` constructors on `@immutable` classes.';
1415

@@ -74,8 +75,10 @@ class _Visitor extends SimpleAstVisitor<void> {
7475
if (element == null) return;
7576
if (element.isConst) return;
7677
if (node.body is! EmptyFunctionBody) return;
77-
if (element.enclosingElement.mixins.isNotEmpty) return;
78-
if (!_hasImmutableAnnotation(element.enclosingElement)) return;
78+
var enclosingElement = element.enclosingElement;
79+
if (enclosingElement.isMacro) return;
80+
if (enclosingElement.mixins.isNotEmpty) return;
81+
if (!_hasImmutableAnnotation(enclosingElement)) return;
7982
var isRedirected =
8083
element.isFactory && element.redirectedConstructor != null;
8184
if (isRedirected && (element.redirectedConstructor?.isConst ?? false)) {

pkg/linter/test/rule_test_support.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,12 @@ abstract class _ContextResolutionTest with ResourceProviderMixin {
764764
);
765765
}
766766

767+
@mustCallSuper
768+
Future<void> tearDown() async {
769+
await _analysisContextCollection?.dispose();
770+
_analysisContextCollection = null;
771+
}
772+
767773
DriverBasedAnalysisContext _contextFor(String path) {
768774
_createAnalysisContexts();
769775

pkg/linter/test/rules/prefer_const_constructors_in_immutables_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,19 @@ class B extends A {
392392
]);
393393
}
394394

395+
test_macroConstructor() async {
396+
await assertDiagnostics(r'''
397+
import 'package:meta/meta.dart';
398+
399+
@immutable
400+
macro class M {
401+
M();
402+
}
403+
''', [
404+
// TODO(pq): add non-const constructor compilation error when implemented
405+
]);
406+
}
407+
395408
test_returnOfInvalidType() async {
396409
await assertDiagnostics(r'''
397410
import 'package:meta/meta.dart';

0 commit comments

Comments
 (0)