| Index: lib/src/info.dart
|
| diff --git a/lib/src/info.dart b/lib/src/info.dart
|
| index 1813efa99916c4013b8ec2abbfe5e4dea5e336b6..1cf9ba7b39fd236d2ecbce1d1205c8358304acb6 100644
|
| --- a/lib/src/info.dart
|
| +++ b/lib/src/info.dart
|
| @@ -8,15 +8,11 @@ library dev_compiler.src.info;
|
|
|
| import 'package:analyzer/src/generated/ast.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/error.dart'
|
| - show AnalysisError, ErrorSeverity;
|
| -import 'package:logging/logging.dart' show Level;
|
| +import 'package:analyzer/src/generated/error.dart';
|
|
|
| import 'package:dev_compiler/src/checker/rules.dart';
|
| import 'package:dev_compiler/src/utils.dart' as utils;
|
|
|
| -import 'report.dart' show Message;
|
| -
|
| /// Represents a summary of the results collected by running the program
|
| /// checker.
|
| class CheckerResults {
|
| @@ -91,18 +87,31 @@ class CoercionError extends Coercion {
|
| CoercionError() : super(null, null);
|
| }
|
|
|
| -abstract class StaticInfo implements Message {
|
| +// TODO(jmesserly): this could use some refactoring. These are essentially
|
| +// like ErrorCodes in analyzer, but we're including some details in our message.
|
| +// Analyzer instead has template strings, and replaces '{0}' with the first
|
| +// argument.
|
| +abstract class StaticInfo {
|
| /// AST Node this info is attached to.
|
| - // TODO(jmesserly): this is somewhat redundant with SemanticNode.
|
| AstNode get node;
|
|
|
| - @override
|
| - int get begin => node is AnnotatedNode
|
| - ? (node as AnnotatedNode).firstTokenAfterCommentAndMetadata.offset
|
| - : node.offset;
|
| + // TODO(jmesserly): review the usage of error codes. We probably want our own,
|
| + // as well as some DDC specific [ErrorType]s.
|
| + ErrorCode toErrorCode();
|
| +
|
| + // TODO(jmesserly): what convention to use here?
|
| + String get name => 'dev_compiler.$runtimeType';
|
| +
|
| + List<Object> get arguments => [node];
|
|
|
| - @override
|
| - int get end => node.end;
|
| + AnalysisError toAnalysisError() {
|
| + int begin = node is AnnotatedNode
|
| + ? (node as AnnotatedNode).firstTokenAfterCommentAndMetadata.offset
|
| + : node.offset;
|
| + int length = node.end - begin;
|
| + var source = (node.root as CompilationUnit).element.source;
|
| + return new AnalysisError(source, begin, length, toErrorCode(), arguments);
|
| + }
|
| }
|
|
|
| /// Implicitly injected expression conversion.
|
| @@ -118,12 +127,8 @@ abstract class CoercionInfo extends StaticInfo {
|
| DartType get baseType => rules.getStaticType(node);
|
| DartType get staticType => convertedType;
|
|
|
| - // safe iff this cannot throw
|
| - bool get safe => false;
|
| -
|
| - Level get level => safe ? Level.CONFIG : Level.INFO;
|
| -
|
| - String get description => '${this.runtimeType}: $baseType to $convertedType';
|
| + String get message;
|
| + toErrorCode() => new HintCode(name, message);
|
|
|
| static const String _propertyName = 'dev_compiler.src.info.CoercionInfo';
|
|
|
| @@ -155,8 +160,9 @@ abstract class DownCast extends CoercionInfo {
|
|
|
| DartType get convertedType => _cast.toType;
|
|
|
| - String get message => '$node ($baseType) will need runtime check '
|
| - 'to cast to type $convertedType';
|
| + @override List<Object> get arguments => [node, baseType, convertedType];
|
| + @override String get message => '{0} ({1}) will need runtime check '
|
| + 'to cast to type {2}';
|
|
|
| // Factory to create correct DownCast variant.
|
| static StaticInfo create(TypeRules rules, Expression expression, Cast cast,
|
| @@ -231,7 +237,7 @@ class DynamicCast extends DownCast {
|
| DynamicCast(TypeRules rules, Expression expression, Cast cast)
|
| : super._internal(rules, expression, cast);
|
|
|
| - final Level level = Level.INFO;
|
| + toErrorCode() => new HintCode(name, message);
|
| }
|
|
|
| // A down cast due to a variable declaration to a ground type. E.g.,
|
| @@ -242,7 +248,7 @@ class AssignmentCast extends DownCast {
|
| AssignmentCast(TypeRules rules, Expression expression, Cast cast)
|
| : super._internal(rules, expression, cast);
|
|
|
| - final Level level = Level.INFO;
|
| + toErrorCode() => new HintCode(name, message);
|
| }
|
|
|
| //
|
| @@ -259,7 +265,7 @@ class UninferredClosure extends DownCast {
|
| UninferredClosure(TypeRules rules, FunctionExpression expression, Cast cast)
|
| : super._internal(rules, expression, cast);
|
|
|
| - final Level level = Level.WARNING;
|
| + toErrorCode() => new StaticTypeWarningCode(name, message);
|
| }
|
|
|
| //
|
| @@ -272,7 +278,7 @@ class DownCastComposite extends DownCast {
|
| DownCastComposite(TypeRules rules, Expression expression, Cast cast)
|
| : super._internal(rules, expression, cast);
|
|
|
| - final Level level = Level.WARNING;
|
| + toErrorCode() => new StaticTypeWarningCode(name, message);
|
| }
|
|
|
| // A down cast to a non-ground type. These behave differently from standard
|
| @@ -281,7 +287,7 @@ class DownCastImplicit extends DownCast {
|
| DownCastImplicit(TypeRules rules, Expression expression, Cast cast)
|
| : super._internal(rules, expression, cast);
|
|
|
| - final Level level = Level.WARNING;
|
| + toErrorCode() => new StaticTypeWarningCode(name, message);
|
| }
|
|
|
| // An inferred type for the wrapped expression, which may need to be
|
| @@ -294,8 +300,10 @@ abstract class InferredTypeBase extends CoercionInfo {
|
|
|
| DartType get type => _type;
|
| DartType get convertedType => type;
|
| - String get message => '$node has inferred type $type';
|
| - Level get level => Level.INFO;
|
| + @override String get message => '{0} has inferred type {1}';
|
| + @override List get arguments => [node, type];
|
| +
|
| + toErrorCode() => new HintCode(name, message);
|
| }
|
|
|
| // Standard / unspecialized inferred type
|
| @@ -344,8 +352,8 @@ class DynamicInvoke extends CoercionInfo {
|
| : super(rules, expression);
|
|
|
| DartType get convertedType => rules.provider.dynamicType;
|
| - String get message => '$node requires dynamic invoke';
|
| - Level get level => Level.INFO;
|
| + String get message => '{0} requires dynamic invoke';
|
| + toErrorCode() => new HintCode(name, message);
|
|
|
| static const String _propertyName = 'dev_compiler.src.info.DynamicInvoke';
|
|
|
| @@ -369,7 +377,9 @@ abstract class StaticError extends StaticInfo {
|
|
|
| StaticError(this.node);
|
|
|
| - Level get level => Level.SEVERE;
|
| + String get message;
|
| +
|
| + toErrorCode() => new CompileTimeErrorCode(name, message);
|
| }
|
|
|
| class StaticTypeError extends StaticError {
|
| @@ -382,8 +392,9 @@ class StaticTypeError extends StaticError {
|
| : baseType = rules.getStaticType(expression),
|
| super(expression);
|
|
|
| - String get message =>
|
| - 'Type check failed: $node ($baseType) is not of type $expectedType' +
|
| + @override List<Object> get arguments => [node, baseType, expectedType];
|
| + @override String get message =>
|
| + 'Type check failed: {0} ({1}) is not of type {2}' +
|
| ((reason == null) ? '' : ' because $reason');
|
| }
|
|
|
| @@ -394,7 +405,8 @@ class InvalidVariableDeclaration extends StaticError {
|
| TypeRules rules, AstNode declaration, this.expectedType)
|
| : super(declaration);
|
|
|
| - String get message => 'Type check failed: null is not of type $expectedType';
|
| + @override List<Object> get arguments => [expectedType];
|
| + @override String get message => 'Type check failed: null is not of type {0}';
|
| }
|
|
|
| class InvalidParameterDeclaration extends StaticError {
|
| @@ -404,7 +416,8 @@ class InvalidParameterDeclaration extends StaticError {
|
| TypeRules rules, FormalParameter declaration, this.expectedType)
|
| : super(declaration);
|
|
|
| - String get message => 'Type check failed: $node is not of type $expectedType';
|
| + @override List<Object> get arguments => [node, expectedType];
|
| + @override String get message => 'Type check failed: {0} is not of type {1}';
|
| }
|
|
|
| class InvalidRuntimeCheckError extends StaticError {
|
| @@ -414,12 +427,13 @@ class InvalidRuntimeCheckError extends StaticError {
|
| assert(node is IsExpression || node is AsExpression);
|
| }
|
|
|
| - String get message => "Invalid runtime check on non-ground type $type";
|
| + @override List<Object> get arguments => [type];
|
| + String get message => "Invalid runtime check on non-ground type {0}";
|
| }
|
|
|
| // Invalid override of an instance member of a class.
|
| abstract class InvalidOverride extends StaticError {
|
| - /// Member delaration with the invalid override.
|
| + /// Member declaration with the invalid override.
|
| final ExecutableElement element;
|
|
|
| /// Type (class or interface) that provides the base declaration.
|
| @@ -446,14 +460,15 @@ abstract class InvalidOverride extends StaticError {
|
|
|
| ClassElement get parent => element.enclosingElement;
|
|
|
| + @override List<Object> get arguments => [parent.name, element.name, subType, base, baseType];
|
| +
|
| String _messageHelper(String errorName) {
|
| - var name = element.name;
|
| var lcErrorName = errorName.toLowerCase();
|
| var intro = fromBaseClass
|
| ? 'Base class introduces an $lcErrorName'
|
| : (fromMixin ? 'Mixin introduces an $lcErrorName' : errorName);
|
| - return '$intro. The type of ${parent.name}.$name ($subType) is not a '
|
| - 'subtype of $base.$name ($baseType).';
|
| + return '$intro. The type of {0}.{1} ({2}) is not a '
|
| + 'subtype of {3}.{1} ({4}).';
|
| }
|
| }
|
|
|
| @@ -475,7 +490,7 @@ class InferableOverride extends InvalidOverride {
|
| DartType subType, DartType baseType)
|
| : super(node, element, base, subType, baseType);
|
|
|
| - Level get level => Level.SEVERE;
|
| + toErrorCode() => new CompileTimeErrorCode(name, message);
|
| String get message => _messageHelper('Invalid but inferable override');
|
| }
|
|
|
| @@ -485,11 +500,13 @@ class InferableOverride extends InvalidOverride {
|
| // the analyzer, so this should likely be removed in the future.
|
| class MissingTypeError extends StaticInfo {
|
| final AstNode node;
|
| - Level get level => Level.WARNING;
|
| + toErrorCode() => new StaticTypeWarningCode(name, message);
|
|
|
| - String get message =>
|
| - "type analysis didn't compute the type of: $node ${node.runtimeType}";
|
| MissingTypeError(this.node);
|
| +
|
| + @override List<Object> get arguments => [node, node.runtimeType];
|
| + String get message =>
|
| + "type analysis didn't compute the type of: {0} {1}";
|
| }
|
|
|
| /// Dart constructors have one weird quirk, illustrated with this example:
|
| @@ -524,20 +541,6 @@ class MissingTypeError extends StaticInfo {
|
| class InvalidSuperInvocation extends StaticError {
|
| InvalidSuperInvocation(SuperConstructorInvocation node) : super(node);
|
|
|
| - String get message => "super call must be last in an initializer list "
|
| - "(see http://goo.gl/q1T4BB): $node";
|
| -}
|
| -
|
| -class AnalyzerMessage extends Message {
|
| - factory AnalyzerMessage.from(AnalysisError error) {
|
| - var severity = error.errorCode.type.severity;
|
| - var isError = severity == ErrorSeverity.WARNING;
|
| - var level = isError ? Level.SEVERE : Level.WARNING;
|
| - int begin = error.offset;
|
| - int end = begin + error.length;
|
| - return new AnalyzerMessage(error.message, level, begin, end);
|
| - }
|
| -
|
| - const AnalyzerMessage(String message, Level level, int begin, int end)
|
| - : super(message, level, begin, end);
|
| + @override String get message => "super call must be last in an initializer "
|
| + "list (see http://goo.gl/q1T4BB): {0}";
|
| }
|
|
|