@@ -9,6 +9,7 @@ import 'dart:convert';
99import 'dart:io' ;
1010
1111import 'package:analyzer_testing/package_root.dart' as pkg_root;
12+ import 'package:analyzer_utilities/analyzer_message_constant_style.dart' ;
1213import 'package:analyzer_utilities/extensions/string.dart' ;
1314import 'package:analyzer_utilities/messages.dart' ;
1415import 'package:analyzer_utilities/tools.dart' ;
@@ -550,6 +551,42 @@ class DiagnosticClassInfo {
550551/// Interface class for diagnostic messages that have an analyzer code, and thus
551552/// can be reported by the analyzer.
552553mixin MessageWithAnalyzerCode on Message {
554+ late ConstantStyle constantStyle = () {
555+ var usesParameters = [problemMessage, correctionMessage].any (
556+ (value) =>
557+ value != null && value.any ((part) => part is TemplateParameterPart ),
558+ );
559+ var baseClasses = analyzerCode.diagnosticClass.type.baseClasses;
560+ if (parameters.isNotEmpty && ! usesParameters) {
561+ throw 'Error code declares parameters using a `parameters` entry, but '
562+ "doesn't use them" ;
563+ } else if (parameters.values.any ((p) => ! p.type.isSupportedByAnalyzer)) {
564+ // Do not generate literate API yet.
565+ return OldConstantStyle (
566+ concreteClassName: baseClasses.withExpectedTypesClass,
567+ staticType: 'DiagnosticCode' ,
568+ );
569+ } else if (parameters.isNotEmpty) {
570+ // Parameters are present so generate a diagnostic template (with
571+ // `.withArguments` support).
572+ var withArgumentsParams = parameters.entries
573+ .map ((p) => 'required ${p .value .type .analyzerName } ${p .key }' )
574+ .join (', ' );
575+ var templateParameters =
576+ '<LocatableDiagnostic Function({$withArgumentsParams })>' ;
577+ return WithArgumentsConstantStyle (
578+ concreteClassName: baseClasses.withArgumentsClass,
579+ staticType: 'DiagnosticWithArguments$templateParameters ' ,
580+ withArgumentsParams: withArgumentsParams,
581+ );
582+ } else {
583+ return WithoutArgumentsConstantStyle (
584+ concreteClassName: baseClasses.withoutArgumentsImplClass,
585+ staticType: baseClasses.withoutArgumentsClass,
586+ );
587+ }
588+ }();
589+
553590 late final DiagnosticClassInfo diagnosticClassInfo =
554591 analyzerCode.diagnosticClass;
555592
@@ -583,44 +620,20 @@ mixin MessageWithAnalyzerCode on Message {
583620 }) {
584621 var diagnosticCode = analyzerCode.snakeCaseName;
585622 var correctionMessage = this .correctionMessage;
586- var parameters = this .parameters;
587- var usesParameters = [problemMessage, correctionMessage].any (
588- (value) =>
589- value != null && value.any ((part) => part is TemplateParameterPart ),
590- );
591- String concreteClassName;
592- String staticType;
593623 String ? withArgumentsName;
594624 var baseClasses = analyzerCode.diagnosticClass.type.baseClasses;
595- if (parameters.isNotEmpty && ! usesParameters) {
596- throw 'Error code declares parameters using a `parameters` entry, but '
597- "doesn't use them" ;
598- } else if (parameters.values.any ((p) => ! p.type.isSupportedByAnalyzer)) {
599- // Do not generate literate API yet.
600- concreteClassName = baseClasses.withExpectedTypesClass;
601- staticType = 'DiagnosticCode' ;
602- } else if (parameters.isNotEmpty) {
603- // Parameters are present so generate a diagnostic template (with
604- // `.withArguments` support).
605- concreteClassName = baseClasses.withArgumentsClass;
606- var withArgumentsParams = parameters.entries
607- .map ((p) => 'required ${p .value .type .analyzerName } ${p .key }' )
608- .join (', ' );
625+ var ConstantStyle (: concreteClassName, : staticType) = constantStyle;
626+ if (constantStyle case WithArgumentsConstantStyle (
627+ : var withArgumentsParams,
628+ )) {
609629 var argumentNames = parameters.keys.join (', ' );
610630 withArgumentsName = '_withArguments${analyzerCode .pascalCaseName }' ;
611- var templateParameters =
612- '<LocatableDiagnostic Function({$withArgumentsParams })>' ;
613- staticType = 'DiagnosticWithArguments$templateParameters ' ;
614631 memberAccumulator.staticMethods[withArgumentsName] =
615632 '''
616633static LocatableDiagnostic $withArgumentsName ({$withArgumentsParams }) {
617634 return LocatableDiagnosticImpl(
618635 ${diagnosticClassInfo .name }.$constantName , [$argumentNames ]);
619636}''' ;
620- } else {
621- // Parameters are not present so generate a "withoutArguments" constant.
622- concreteClassName = baseClasses.withoutArgumentsImplClass;
623- staticType = baseClasses.withoutArgumentsClass;
624637 }
625638
626639 var constant = StringBuffer ();
0 commit comments