blob: 245c3910a3037ebe3681f22ad9a8da40a39a145f [file] [log] [blame]
// Copyright (c) 2022, 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/source/source_range.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/summary2/macro_type_location.dart';
import 'package:macros/macros.dart' as macro;
import 'package:macros/src/executor.dart' as macro;
/// Base for all macro related diagnostics.
sealed class AnalyzerMacroDiagnostic {}
final class ApplicationMacroDiagnosticTarget extends MacroDiagnosticTarget {
final int annotationIndex;
ApplicationMacroDiagnosticTarget({
required this.annotationIndex,
});
}
/// An error while evaluating macro application argument.
final class ArgumentMacroDiagnostic extends AnalyzerMacroDiagnostic {
final int annotationIndex;
final int argumentIndex;
final String message;
ArgumentMacroDiagnostic({
required this.annotationIndex,
required this.argumentIndex,
required this.message,
});
}
final class DeclarationsIntrospectionCycleComponent {
final ElementImpl element;
final int annotationIndex;
final ElementImpl introspectedElement;
DeclarationsIntrospectionCycleComponent({
required this.element,
required this.annotationIndex,
required this.introspectedElement,
});
}
/// A cycle during declarations phase introspection.
final class DeclarationsIntrospectionCycleDiagnostic
extends AnalyzerMacroDiagnostic {
final int annotationIndex;
final ElementImpl introspectedElement;
final List<DeclarationsIntrospectionCycleComponent> components;
DeclarationsIntrospectionCycleDiagnostic({
required this.annotationIndex,
required this.introspectedElement,
required this.components,
});
}
final class ElementAnnotationMacroDiagnosticTarget
extends MacroDiagnosticTarget {
final ElementImpl element;
final int annotationIndex;
ElementAnnotationMacroDiagnosticTarget({
required this.element,
required this.annotationIndex,
});
}
final class ElementMacroDiagnosticTarget extends MacroDiagnosticTarget {
final ElementImpl element;
ElementMacroDiagnosticTarget({
required this.element,
});
}
/// An exception while preparing macro application.
final class ExceptionMacroDiagnostic extends AnalyzerMacroDiagnostic {
final int annotationIndex;
final String message;
final String stackTrace;
ExceptionMacroDiagnostic({
required this.annotationIndex,
required this.message,
required this.stackTrace,
});
}
final class InvalidMacroTargetDiagnostic extends AnalyzerMacroDiagnostic {
final int annotationIndex;
final List<String> supportedKinds;
InvalidMacroTargetDiagnostic({
required this.annotationIndex,
required this.supportedKinds,
});
}
/// Diagnostic from the macro framework.
final class MacroDiagnostic extends AnalyzerMacroDiagnostic {
final macro.Severity severity;
final MacroDiagnosticMessage message;
final List<MacroDiagnosticMessage> contextMessages;
final String? correctionMessage;
MacroDiagnostic({
required this.severity,
required this.message,
required this.contextMessages,
required this.correctionMessage,
});
}
final class MacroDiagnosticMessage {
final MacroDiagnosticTarget target;
final String message;
MacroDiagnosticMessage({
required this.target,
required this.message,
});
}
sealed class MacroDiagnosticTarget {}
/// Macro phases are progressively restricted in what kinds of declarations
/// they are allowed to add.
///
/// The `types` phase can add anything.
/// The `declarations` phase cannot add types.
/// The `definitions` phase cannot add any declarations.
final class NotAllowedDeclarationDiagnostic extends AnalyzerMacroDiagnostic {
final int annotationIndex;
final macro.Phase phase;
/// The source code with not allowed declarations.
final String code;
/// The ranges of not allowed declarations in [code].
final List<SourceRange> nodeRanges;
NotAllowedDeclarationDiagnostic({
required this.annotationIndex,
required this.phase,
required this.code,
required this.nodeRanges,
});
}
final class TypeAnnotationMacroDiagnosticTarget extends MacroDiagnosticTarget {
final TypeAnnotationLocation location;
TypeAnnotationMacroDiagnosticTarget({
required this.location,
});
}