blob: da45cd551283661da05e46017e25f6d2ba385df9 [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// 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/ast/syntactic_entity.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/error/element_usage_detector.dart';
/// Instance of [ElementUsageReporter] for reporting uses of experimental
/// elements.
class ExperimentalElementUsageReporter implements ElementUsageReporter<()> {
final DiagnosticReporter _diagnosticReporter;
ExperimentalElementUsageReporter({
required DiagnosticReporter diagnosticReporter,
}) : _diagnosticReporter = diagnosticReporter;
@override
void report(
SyntacticEntity errorEntity,
String displayName,
() tagInfo, {
required bool isInSamePackage,
}) {
// Use of an experimental API from within the same package is OK
if (isInSamePackage) return;
_diagnosticReporter.atEntity(
errorEntity,
WarningCode.experimentalMemberUse,
arguments: [displayName],
);
}
}
/// Instance of [ElementUsageSet] for experimental elements.
class ExperimentalElementUsageSet implements ElementUsageSet<()> {
const ExperimentalElementUsageSet();
@override
()? getTagInfo(Element element) =>
element.metadata.annotations.any((e) => e.isExperimental) ? () : null;
}