blob: 711d9413f2e99a5a2a24fc191d7bdef6cba14824 [file]
// Copyright (c) 2026, 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:front_end/src/codes/diagnostic.dart' as diag;
import 'package:front_end/src/api_prototype/constant_evaluator.dart';
import 'package:front_end/src/kernel/utils.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/kernel.dart';
class ExternalEffect {
static const String pragmaName = 'external-effect';
// Coverage-ignore(suite): Not run.
static bool isExternalEffect(StaticInvocation node) {
return node.target.hasExternalEffectPragma;
}
static bool isOutlineAnnotatedWithExternalEffect(
Annotatable node,
CoreTypes coreTypes,
) {
return isOutlineAnnotatedWithPragma(node, coreTypes, pragmaName);
}
static bool isAnnotatedWithExternalEffect(
Annotatable node,
CoreTypes coreTypes,
) {
return isAnnotatedWithPragma(node, coreTypes, pragmaName);
}
static void validatePragma(
Annotatable node,
CoreTypes coreTypes,
ErrorReporter errorReporter, {
required bool checkHasFlag,
}) {
if (node is! Procedure || node.kind != ProcedureKind.Method) {
errorReporter.report(
diag.dartExternalEffectNotMethod.withLocation(
node.location!.file,
node.fileOffset,
1,
),
);
return;
}
if (node.isInstanceMember) {
errorReporter.report(
diag.dartExternalEffectNotStatic.withLocation(
node.location!.file,
node.fileOffset,
1,
),
);
return;
}
if (!node.isExternal) {
errorReporter.report(
diag.dartExternalEffectNotExternal.withLocation(
node.location!.file,
node.fileOffset,
1,
),
);
return;
}
FunctionNode function = node.function;
if (function.computeFunctionType(Nullability.nonNullable) !=
new FunctionType(
[coreTypes.objectNullableRawType],
const VoidType(),
Nullability.nonNullable,
)) {
errorReporter.report(
diag.dartExternalEffectIncorrectType.withLocation(
node.location!.file,
node.fileOffset,
1,
),
);
return;
}
if (checkHasFlag && !node.hasExternalEffectPragma) {
errorReporter.report(
diag.dartExternalEffectMalformedPragma.withLocation(
node.location!.file,
node.fileOffset,
1,
),
);
}
node.hasExternalEffectPragma = true;
}
}