mirror of
https://github.com/dart-lang/sdk
synced 2024-07-08 12:06:26 +00:00
Separate severity for context messages
Change-Id: I8c0f9f0eae141e38e1f57afce4a30b6f95e8e412 Reviewed-on: https://dart-review.googlesource.com/43721 Reviewed-by: Peter von der Ahé <ahe@google.com> Commit-Queue: Aske Simon Christensen <askesc@google.com>
This commit is contained in:
parent
af527dd769
commit
bb088347f0
|
@ -99,6 +99,9 @@ void reportFrontEndMessage(
|
|||
case fe.Severity.nit:
|
||||
reporter.reportHintMessage(span, kind, {'text': message.message});
|
||||
break;
|
||||
case fe.Severity.context:
|
||||
reporter.reportInfo(span, kind, {'text': message.message});
|
||||
break;
|
||||
default:
|
||||
throw new UnimplementedError('unhandled severity ${message.severity}');
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ import 'dart:io' show exitCode;
|
|||
|
||||
import 'package:kernel/ast.dart' show Location;
|
||||
|
||||
import 'colors.dart' show cyan, magenta, red;
|
||||
import 'colors.dart' show cyan, green, magenta, red;
|
||||
|
||||
import 'compiler_context.dart' show CompilerContext;
|
||||
|
||||
|
@ -68,6 +68,10 @@ String formatInternal(
|
|||
text = magenta(text);
|
||||
break;
|
||||
|
||||
case Severity.context:
|
||||
text = green(text);
|
||||
break;
|
||||
|
||||
default:
|
||||
return unexpected("$severity", "formatInternal", -1, null);
|
||||
}
|
||||
|
@ -115,6 +119,7 @@ bool isHidden(Severity severity) {
|
|||
switch (severity) {
|
||||
case Severity.error:
|
||||
case Severity.internalProblem:
|
||||
case Severity.context:
|
||||
return false;
|
||||
|
||||
case Severity.nit:
|
||||
|
@ -144,6 +149,9 @@ bool shouldThrowOn(Severity severity) {
|
|||
case Severity.warning:
|
||||
return CompilerContext.current.options.throwOnWarningsForDebugging;
|
||||
|
||||
case Severity.context:
|
||||
return false;
|
||||
|
||||
default:
|
||||
return unexpected("$severity", "shouldThrowOn", -1, null);
|
||||
}
|
||||
|
@ -164,6 +172,9 @@ String severityName(Severity severity, {bool capitalized: false}) {
|
|||
case Severity.warning:
|
||||
return capitalized ? "Warning" : "warning";
|
||||
|
||||
case Severity.context:
|
||||
return capitalized ? "Context" : "context";
|
||||
|
||||
default:
|
||||
return unexpected("$severity", "severityName", -1, null);
|
||||
}
|
||||
|
@ -204,6 +215,7 @@ bool isCompileTimeError(Severity severity) {
|
|||
|
||||
case Severity.nit:
|
||||
case Severity.warning:
|
||||
case Severity.context:
|
||||
return false;
|
||||
}
|
||||
return unexpected("$severity", "isCompileTimeError", -1, null);
|
||||
|
|
|
@ -288,6 +288,7 @@ const Code<Null> codeCandidateFound = messageCandidateFound;
|
|||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const MessageCode messageCandidateFound = const MessageCode("CandidateFound",
|
||||
severity: Severity.context,
|
||||
message: r"""Found this candidate, but the arguments don't match.""");
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
|
@ -302,9 +303,9 @@ const Template<Message Function(String name)>
|
|||
const Code<Message Function(String name)>
|
||||
codeCandidateFoundIsDefaultConstructor =
|
||||
const Code<Message Function(String name)>(
|
||||
"CandidateFoundIsDefaultConstructor",
|
||||
templateCandidateFoundIsDefaultConstructor,
|
||||
);
|
||||
"CandidateFoundIsDefaultConstructor",
|
||||
templateCandidateFoundIsDefaultConstructor,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsCandidateFoundIsDefaultConstructor(String name) {
|
||||
|
@ -635,7 +636,7 @@ const Code<Null> codeConflictsWithTypeVariableCause =
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const MessageCode messageConflictsWithTypeVariableCause = const MessageCode(
|
||||
"ConflictsWithTypeVariableCause",
|
||||
severity: Severity.error,
|
||||
severity: Severity.context,
|
||||
message: r"""This is the type variable.""");
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
|
@ -709,6 +710,7 @@ const Code<Null> codeConstConstructorNonFinalFieldCause =
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const MessageCode messageConstConstructorNonFinalFieldCause = const MessageCode(
|
||||
"ConstConstructorNonFinalFieldCause",
|
||||
severity: Severity.context,
|
||||
message: r"""Field isn't final, but constructor is 'const'.""");
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
|
@ -984,9 +986,8 @@ const Template<Message Function(String name)>
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Code<Message Function(String name)> codeDeferredPrefixDuplicatedCause =
|
||||
const Code<Message Function(String name)>(
|
||||
"DeferredPrefixDuplicatedCause",
|
||||
templateDeferredPrefixDuplicatedCause,
|
||||
);
|
||||
"DeferredPrefixDuplicatedCause", templateDeferredPrefixDuplicatedCause,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsDeferredPrefixDuplicatedCause(String name) {
|
||||
|
@ -1292,9 +1293,8 @@ const Template<Message Function(String name)>
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Code<Message Function(String name)> codeDuplicatedParameterNameCause =
|
||||
const Code<Message Function(String name)>(
|
||||
"DuplicatedParameterNameCause",
|
||||
templateDuplicatedParameterNameCause,
|
||||
);
|
||||
"DuplicatedParameterNameCause", templateDuplicatedParameterNameCause,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsDuplicatedParameterNameCause(String name) {
|
||||
|
@ -2083,7 +2083,7 @@ const Code<Message Function(String name)>
|
|||
const Code<Message Function(String name)>(
|
||||
"FinalInstanceVariableAlreadyInitializedCause",
|
||||
templateFinalInstanceVariableAlreadyInitializedCause,
|
||||
severity: Severity.errorLegacyWarning);
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsFinalInstanceVariableAlreadyInitializedCause(
|
||||
|
@ -2263,9 +2263,9 @@ const Template<Message Function(String name)>
|
|||
const Code<Message Function(String name)>
|
||||
codeIllegalMixinDueToConstructorsCause =
|
||||
const Code<Message Function(String name)>(
|
||||
"IllegalMixinDueToConstructorsCause",
|
||||
templateIllegalMixinDueToConstructorsCause,
|
||||
);
|
||||
"IllegalMixinDueToConstructorsCause",
|
||||
templateIllegalMixinDueToConstructorsCause,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsIllegalMixinDueToConstructorsCause(String name) {
|
||||
|
@ -3867,9 +3867,8 @@ const Template<Message Function(String name)> templateOverriddenMethodCause =
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Code<Message Function(String name)> codeOverriddenMethodCause =
|
||||
const Code<Message Function(String name)>(
|
||||
"OverriddenMethodCause",
|
||||
templateOverriddenMethodCause,
|
||||
);
|
||||
"OverriddenMethodCause", templateOverriddenMethodCause,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsOverriddenMethodCause(String name) {
|
||||
|
@ -4262,6 +4261,7 @@ const Code<Null> codePatchClassOrigin = messagePatchClassOrigin;
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const MessageCode messagePatchClassOrigin = const MessageCode(
|
||||
"PatchClassOrigin",
|
||||
severity: Severity.context,
|
||||
message: r"""This is the origin class.""");
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
|
@ -4288,6 +4288,7 @@ const Code<Null> codePatchDeclarationOrigin = messagePatchDeclarationOrigin;
|
|||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const MessageCode messagePatchDeclarationOrigin = const MessageCode(
|
||||
"PatchDeclarationOrigin",
|
||||
severity: Severity.context,
|
||||
message: r"""This is the origin declaration.""");
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
|
@ -5239,10 +5240,9 @@ const Template<Message Function(String name)>
|
|||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
const Code<Message Function(String name)> codeTypeVariableDuplicatedNameCause =
|
||||
const Code<Message Function(String name)>(
|
||||
"TypeVariableDuplicatedNameCause",
|
||||
templateTypeVariableDuplicatedNameCause,
|
||||
);
|
||||
const Code<Message Function(String name)>("TypeVariableDuplicatedNameCause",
|
||||
templateTypeVariableDuplicatedNameCause,
|
||||
severity: Severity.context);
|
||||
|
||||
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
||||
Message _withArgumentsTypeVariableDuplicatedNameCause(String name) {
|
||||
|
|
|
@ -3613,12 +3613,10 @@ class BodyBuilder<Arguments> extends ScopeListener<JumpTarget>
|
|||
fasta.templateFinalInstanceVariableAlreadyInitialized
|
||||
.withArguments(name),
|
||||
offset,
|
||||
noLength);
|
||||
addProblem(
|
||||
fasta.templateFinalInstanceVariableAlreadyInitializedCause
|
||||
.withArguments(name),
|
||||
builder.charOffset,
|
||||
noLength);
|
||||
noLength,
|
||||
context: fasta.templateFinalInstanceVariableAlreadyInitializedCause
|
||||
.withArguments(name)
|
||||
.withLocation(uri, builder.charOffset, noLength));
|
||||
Builder constructor =
|
||||
library.loader.getDuplicatedFieldInitializerError();
|
||||
return buildInvalidInitializer(
|
||||
|
@ -3814,13 +3812,16 @@ class BodyBuilder<Arguments> extends ScopeListener<JumpTarget>
|
|||
}
|
||||
|
||||
@override
|
||||
void addCompileTimeError(Message message, int charOffset, int length) {
|
||||
library.addCompileTimeError(message, charOffset, length, uri);
|
||||
void addCompileTimeError(Message message, int charOffset, int length,
|
||||
{LocatedMessage context}) {
|
||||
library.addCompileTimeError(message, charOffset, length, uri,
|
||||
context: context);
|
||||
}
|
||||
|
||||
@override
|
||||
void addProblem(Message message, int charOffset, int length) {
|
||||
library.addProblem(message, charOffset, length, uri);
|
||||
void addProblem(Message message, int charOffset, int length,
|
||||
{LocatedMessage context}) {
|
||||
library.addProblem(message, charOffset, length, uri, context: context);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -3830,7 +3831,7 @@ class BodyBuilder<Arguments> extends ScopeListener<JumpTarget>
|
|||
// take two messages: one to use when a constant expression is
|
||||
// required and one to use otherwise.
|
||||
if (constantExpressionRequired) {
|
||||
addCompileTimeError(message, charOffset, length);
|
||||
addCompileTimeError(message, charOffset, length, context: context);
|
||||
} else {
|
||||
library.addProblem(message, charOffset, length, uri, context: context);
|
||||
}
|
||||
|
|
|
@ -233,12 +233,11 @@ class KernelLibraryBuilder
|
|||
TypeVariableBuilder existing = typeVariablesByName[tv.name];
|
||||
if (existing != null) {
|
||||
addCompileTimeError(messageTypeVariableDuplicatedName, tv.charOffset,
|
||||
tv.name.length, fileUri);
|
||||
addCompileTimeError(
|
||||
templateTypeVariableDuplicatedNameCause.withArguments(tv.name),
|
||||
existing.charOffset,
|
||||
existing.name.length,
|
||||
fileUri);
|
||||
tv.name.length, fileUri,
|
||||
context: templateTypeVariableDuplicatedNameCause
|
||||
.withArguments(tv.name)
|
||||
.withLocation(
|
||||
fileUri, existing.charOffset, existing.name.length));
|
||||
} else {
|
||||
typeVariablesByName[tv.name] = tv;
|
||||
if (owner is ClassBuilder) {
|
||||
|
|
|
@ -643,6 +643,8 @@ class KernelTarget extends TargetImplementation {
|
|||
if (constructor.isConst && nonFinalFields.isNotEmpty) {
|
||||
builder.addCompileTimeError(messageConstConstructorNonFinalField,
|
||||
constructor.fileOffset, noLength);
|
||||
// TODO(askesc): Put as context argument when multiple contexts
|
||||
// are supported.
|
||||
for (Field field in nonFinalFields) {
|
||||
builder.addCompileTimeError(
|
||||
messageConstConstructorNonFinalFieldCause,
|
||||
|
|
|
@ -248,7 +248,7 @@ severity: $severity
|
|||
target.context
|
||||
.report(message.withLocation(fileUri, charOffset, length), severity);
|
||||
if (context != null) {
|
||||
target.context.report(context, severity);
|
||||
target.context.report(context, Severity.context);
|
||||
}
|
||||
recordMessage(severity, message, charOffset, length, fileUri,
|
||||
context: context);
|
||||
|
|
|
@ -5,9 +5,10 @@
|
|||
library fasta.severity;
|
||||
|
||||
enum Severity {
|
||||
context,
|
||||
error,
|
||||
errorLegacyWarning,
|
||||
internalProblem,
|
||||
nit,
|
||||
warning,
|
||||
errorLegacyWarning,
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import '../combinator.dart' show Combinator;
|
|||
import '../fasta_codes.dart'
|
||||
show
|
||||
Message,
|
||||
LocatedMessage,
|
||||
messageExpectedBlockToSkip,
|
||||
messageInterpolationInUri,
|
||||
messageOperatorWithOptionalFormals,
|
||||
|
@ -786,12 +787,11 @@ class OutlineBuilder extends UnhandledListener {
|
|||
addCompileTimeError(
|
||||
templateDuplicatedParameterName.withArguments(formals[1].name),
|
||||
formals[1].charOffset,
|
||||
formals[1].name.length);
|
||||
addCompileTimeError(
|
||||
templateDuplicatedParameterNameCause
|
||||
.withArguments(formals[1].name),
|
||||
formals[0].charOffset,
|
||||
formals[0].name.length);
|
||||
formals[1].name.length,
|
||||
context: templateDuplicatedParameterNameCause
|
||||
.withArguments(formals[1].name)
|
||||
.withLocation(
|
||||
uri, formals[0].charOffset, formals[0].name.length));
|
||||
}
|
||||
} else if (formals.length > 2) {
|
||||
Map<String, FormalParameterBuilder> seenNames =
|
||||
|
@ -1102,12 +1102,15 @@ class OutlineBuilder extends UnhandledListener {
|
|||
}
|
||||
|
||||
@override
|
||||
void addCompileTimeError(Message message, int charOffset, int length) {
|
||||
library.addCompileTimeError(message, charOffset, length, uri);
|
||||
void addCompileTimeError(Message message, int charOffset, int length,
|
||||
{LocatedMessage context}) {
|
||||
library.addCompileTimeError(message, charOffset, length, uri,
|
||||
context: context);
|
||||
}
|
||||
|
||||
void addProblem(Message message, int charOffset, int length) {
|
||||
library.addProblem(message, charOffset, length, uri);
|
||||
void addProblem(Message message, int charOffset, int length,
|
||||
{LocatedMessage context}) {
|
||||
library.addProblem(message, charOffset, length, uri, context: context);
|
||||
}
|
||||
|
||||
/// Return the documentation comment for the entity that starts at the
|
||||
|
|
|
@ -444,12 +444,10 @@ abstract class SourceLibraryBuilder<T extends TypeBuilder, R>
|
|||
templateDeferredPrefixDuplicated.withArguments(name),
|
||||
deferred.charOffset,
|
||||
noLength,
|
||||
fileUri);
|
||||
addCompileTimeError(
|
||||
templateDeferredPrefixDuplicatedCause.withArguments(name),
|
||||
other.charOffset,
|
||||
noLength,
|
||||
fileUri);
|
||||
fileUri,
|
||||
context: templateDeferredPrefixDuplicatedCause
|
||||
.withArguments(name)
|
||||
.withLocation(fileUri, other.charOffset, noLength));
|
||||
}
|
||||
return existing
|
||||
..exportScope.merge(builder.exportScope,
|
||||
|
|
|
@ -521,12 +521,11 @@ class SourceLoader<L> extends Loader<L> {
|
|||
templateIllegalMixinDueToConstructors
|
||||
.withArguments(builder.fullNameForErrors),
|
||||
cls.charOffset,
|
||||
noLength);
|
||||
builder.addCompileTimeError(
|
||||
templateIllegalMixinDueToConstructorsCause
|
||||
.withArguments(builder.fullNameForErrors),
|
||||
constructory.charOffset,
|
||||
noLength);
|
||||
noLength,
|
||||
context: templateIllegalMixinDueToConstructorsCause
|
||||
.withArguments(builder.fullNameForErrors)
|
||||
.withLocation(constructory.fileUri,
|
||||
constructory.charOffset, noLength));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -782,6 +781,10 @@ class SourceLoader<L> extends Loader<L> {
|
|||
// Use a property name expressing that, in case it slips through.
|
||||
severityString = "unresolved severity";
|
||||
break;
|
||||
|
||||
case Severity.context:
|
||||
severityString = "context";
|
||||
break;
|
||||
}
|
||||
instrumentation.record(
|
||||
fileUri,
|
||||
|
|
|
@ -946,9 +946,11 @@ MethodNotFound:
|
|||
|
||||
CandidateFound:
|
||||
template: "Found this candidate, but the arguments don't match."
|
||||
severity: CONTEXT
|
||||
|
||||
CandidateFoundIsDefaultConstructor:
|
||||
template: "The class '#name' has a constructor that takes no arguments."
|
||||
severity: CONTEXT
|
||||
|
||||
TooFewArgumentsToFunction:
|
||||
template: "Too few positional arguments to function: #count required, #count2 given."
|
||||
|
@ -1283,6 +1285,7 @@ IllegalMixinDueToConstructors:
|
|||
|
||||
IllegalMixinDueToConstructorsCause:
|
||||
template: "This constructor prevents using '#name' as a mixin."
|
||||
severity: CONTEXT
|
||||
|
||||
ConflictsWithConstructor:
|
||||
template: "Conflicts with constructor '#name'."
|
||||
|
@ -1313,8 +1316,8 @@ ConflictsWithTypeVariable:
|
|||
severity: ERROR
|
||||
|
||||
ConflictsWithTypeVariableCause:
|
||||
template: "This is the type variable."
|
||||
severity: ERROR
|
||||
template: "This is the type variable."
|
||||
severity: CONTEXT
|
||||
|
||||
IllegalMixin:
|
||||
template: "The type '#name' can't be mixed in."
|
||||
|
@ -1325,6 +1328,7 @@ OverrideTypeVariablesMismatch:
|
|||
|
||||
OverriddenMethodCause:
|
||||
template: "This is the overriden method ('#name')."
|
||||
severity: CONTEXT
|
||||
|
||||
OverrideMismatchNamedParameter:
|
||||
template: "The method '#name' doesn't have the named parameter '#name2' of overriden method '#name3'."
|
||||
|
@ -1369,6 +1373,7 @@ TypeVariableDuplicatedName:
|
|||
|
||||
TypeVariableDuplicatedNameCause:
|
||||
template: "The other type variable named '#name'."
|
||||
severity: CONTEXT
|
||||
|
||||
TypeVariableSameNameAsEnclosing:
|
||||
template: "A type variable can't have the same name as its enclosing declaration."
|
||||
|
@ -1538,6 +1543,7 @@ DeferredPrefixDuplicated:
|
|||
|
||||
DeferredPrefixDuplicatedCause:
|
||||
template: "'#name' is used here."
|
||||
severity: CONTEXT
|
||||
|
||||
TypeArgumentsOnTypeVariable:
|
||||
template: "Can't use type arguments with type variable '#name'."
|
||||
|
@ -1559,6 +1565,7 @@ DuplicatedParameterName:
|
|||
|
||||
DuplicatedParameterNameCause:
|
||||
template: "Other parameter named '#name'."
|
||||
severity: CONTEXT
|
||||
|
||||
MemberWithSameNameAsClass:
|
||||
template: "A class member can't have the same name as the enclosing class."
|
||||
|
@ -1675,7 +1682,7 @@ FinalInstanceVariableAlreadyInitialized:
|
|||
|
||||
FinalInstanceVariableAlreadyInitializedCause:
|
||||
template: "'#name' was initialized here."
|
||||
severity: ERROR_LEGACY_WARNING
|
||||
severity: CONTEXT
|
||||
|
||||
TypeVariableInStaticContext:
|
||||
template: "Type variables can't be used in static members."
|
||||
|
@ -1709,6 +1716,7 @@ ConstConstructorNonFinalField:
|
|||
|
||||
ConstConstructorNonFinalFieldCause:
|
||||
template: "Field isn't final, but constructor is 'const'."
|
||||
severity: CONTEXT
|
||||
|
||||
AccessError:
|
||||
template: "Access error: '#name'."
|
||||
|
@ -1829,12 +1837,14 @@ PatchClassTypeVariablesMismatch:
|
|||
|
||||
PatchClassOrigin:
|
||||
template: "This is the origin class."
|
||||
severity: CONTEXT
|
||||
|
||||
PatchDeclarationMismatch:
|
||||
template: "This patch doesn't match origin declaration."
|
||||
|
||||
PatchDeclarationOrigin:
|
||||
template: "This is the origin declaration."
|
||||
severity: CONTEXT
|
||||
|
||||
PatchInjectionFailed:
|
||||
template: "Can't inject '#name' into '#uri'."
|
||||
|
|
|
@ -16,6 +16,7 @@ Map<String, String> severityEnumNames = <String, String>{
|
|||
'ERROR': 'error',
|
||||
'ERROR_LEGACY_WARNING': 'errorLegacyWarning',
|
||||
'INTERNAL_PROBLEM': 'internalProblem',
|
||||
'CONTEXT': 'context',
|
||||
};
|
||||
|
||||
main(List<String> arguments) async {
|
||||
|
|
|
@ -102,6 +102,9 @@ abstract class Compiler {
|
|||
case Severity.warning:
|
||||
if (!suppressWarnings) stderr.writeln(formatted);
|
||||
break;
|
||||
case Severity.context:
|
||||
stderr.writeln(formatted);
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user