blob: 81d12aaf679ac21eb25059e8702fdf5ab1e3cefc [file] [log] [blame]
// Copyright (c) 2016, 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:_fe_analyzer_shared/src/messages/severity.dart'
show CfeSeverity;
import 'package:kernel/ast.dart';
import 'package:kernel/type_environment.dart' show TypeEnvironment;
import 'package:kernel/verifier.dart';
import '../codes/cfe_codes.dart'
show
LocatedMessage,
Message,
codeVerificationErrorOriginContext,
noLength,
codeInternalProblemVerificationError;
import '../base/compiler_context.dart' show CompilerContext;
List<LocatedMessage> verifyComponent(
CompilerContext context,
VerificationStage stage,
Component component, {
bool skipPlatform = false,
bool Function(Library library)? librarySkipFilter,
}) {
CfeVerificationErrorListener listener = new CfeVerificationErrorListener(
context,
);
VerifyingVisitor verifier = new VerifyingVisitor(
context.options.target,
stage,
skipPlatform: skipPlatform,
librarySkipFilter: librarySkipFilter,
listener: listener,
);
component.accept(verifier);
return listener.errors;
}
class CfeVerificationErrorListener implements VerificationErrorListener {
final CompilerContext compilerContext;
List<LocatedMessage> errors = [];
CfeVerificationErrorListener(this.compilerContext);
@override
// Coverage-ignore(suite): Not run.
void reportError(
String details, {
required TreeNode? node,
required Uri? problemUri,
required int? problemOffset,
required TreeNode? context,
required TreeNode? origin,
}) {
Message message = codeInternalProblemVerificationError.withArguments(
details,
);
LocatedMessage locatedMessage = problemUri != null
? message.withLocation(
problemUri,
problemOffset ?? TreeNode.noOffset,
noLength,
)
: message.withoutLocation();
List<LocatedMessage>? contextMessages;
if (origin != null) {
contextMessages = [
codeVerificationErrorOriginContext.withLocation(
origin.location!.file,
origin.fileOffset,
noLength,
),
];
}
compilerContext.report(
locatedMessage,
CfeSeverity.error,
context: contextMessages,
);
errors.add(locatedMessage);
}
}
void verifyGetStaticType(
TypeEnvironment env,
Component component, {
bool skipPlatform = false,
}) {
component.accept(new CfeVerifyGetStaticType(env, skipPlatform));
}
class CfeVerifyGetStaticType extends VerifyGetStaticType {
final bool skipPlatform;
CfeVerifyGetStaticType(TypeEnvironment env, this.skipPlatform) : super(env);
@override
void visitLibrary(Library node) {
// 'dart:test' is used in the unit tests and isn't an actual part of the
// platform.
if (skipPlatform &&
node.importUri.isScheme('dart') &&
node.importUri.path != "test") {
return;
}
super.visitLibrary(node);
}
}