blob: 458cfb252db9442a80e73b014f5597a73b1fe2c0 [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.engine.error;
/**
* The enumeration {@code HintCode} defines the hints and coding recommendations for best practices
* which are not mentioned in the Dart Language Specification.
*/
public enum HintCode implements ErrorCode {
/**
* This hint is generated anywhere where the
* {@link StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE} would have been generated, if we used
* propagated information for the warnings.
*
* @param actualType the name of the actual argument type
* @param expectedType the name of the expected type
* @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
*/
ARGUMENT_TYPE_NOT_ASSIGNABLE(
"The argument type '%s' cannot be assigned to the parameter type '%s'"),
/**
* Dead code is code that is never reached, this can happen for instance if a statement follows a
* return statement.
*/
DEAD_CODE("Dead code"),
/**
* Dead code is code that is never reached. This case covers cases where the user has catch
* clauses after {@code catch (e)} or {@code on Object catch (e)}.
*/
DEAD_CODE_CATCH_FOLLOWING_CATCH(
"Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached"),
/**
* Dead code is code that is never reached. This case covers cases where the user has an on-catch
* clause such as {@code on A catch (e)}, where a supertype of {@code A} was already caught.
*
* @param subtypeName name of the subtype
* @param supertypeName name of the supertype
*/
DEAD_CODE_ON_CATCH_SUBTYPE(
"Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'"),
/**
* Deprecated members should not be invoked or used.
*
* @param memberName the name of the member
*/
DEPRECATED_MEMBER_USE("'%s' is deprecated"),
/**
* Duplicate imports.
*/
DUPLICATE_IMPORT("Duplicate import"),
/**
* Hint to use the ~/ operator.
*/
DIVISION_OPTIMIZATION("The operator x ~/ y is more efficient than (x / y).toInt()"),
/**
* Hint for the {@code x is double} type checks.
*/
IS_DOUBLE("When compiled to JS, this test might return true when the left hand side is an int"),
/**
* Hint for the {@code x is int} type checks.
*/
IS_INT("When compiled to JS, this test might return true when the left hand side is a double"),
/**
* Hint for the {@code x is! double} type checks.
*/
IS_NOT_DOUBLE(
"When compiled to JS, this test might return false when the left hand side is an int"),
/**
* Hint for the {@code x is! int} type checks.
*/
IS_NOT_INT(
"When compiled to JS, this test might return false when the left hand side is a double"),
/**
* Deferred libraries shouldn't define a top level function 'loadLibrary'.
*/
IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION(
"The library '%s' defines a top-level function named 'loadLibrary' which is hidden by deferring this library"),
/**
* This hint is generated anywhere where the {@link StaticTypeWarningCode#INVALID_ASSIGNMENT}
* would have been generated, if we used propagated information for the warnings.
*
* @param rhsTypeName the name of the right hand side type
* @param lhsTypeName the name of the left hand side type
* @see StaticTypeWarningCode#INVALID_ASSIGNMENT
*/
INVALID_ASSIGNMENT("A value of type '%s' cannot be assigned to a variable of type '%s'"),
/**
* Generate a hint for methods or functions that have a return type, but do not have a non-void
* return statement on all branches. At the end of methods or functions with no return, Dart
* implicitly returns {@code null}, avoiding these implicit returns is considered a best practice.
*
* @param returnType the name of the declared return type
*/
MISSING_RETURN(
"This function declares a return type of '%s', but does not end with a return statement",
"Either add a return statement or change the return type to 'void'"),
/**
* A getter with the override annotation does not override an existing getter.
*/
OVERRIDE_ON_NON_OVERRIDING_GETTER("Getter does not override an inherited getter"),
/**
* A method with the override annotation does not override an existing method.
*/
OVERRIDE_ON_NON_OVERRIDING_METHOD("Method does not override an inherited method"),
/**
* A setter with the override annotation does not override an existing setter.
*/
OVERRIDE_ON_NON_OVERRIDING_SETTER("Setter does not override an inherited setter"),
/**
* Hint for classes that override equals, but not hashCode.
*
* @param className the name of the current class
*/
OVERRIDE_EQUALS_BUT_NOT_HASH_CODE("The class '%s' overrides 'operator==', but not 'get hashCode'"),
/**
* Type checks of the type {@code x is! Null} should be done with {@code x != null}.
*/
TYPE_CHECK_IS_NOT_NULL("Tests for non-null should be done with '!= null'"),
/**
* Type checks of the type {@code x is Null} should be done with {@code x == null}.
*/
TYPE_CHECK_IS_NULL("Tests for null should be done with '== null'"),
/**
* This hint is generated anywhere where the {@link StaticTypeWarningCode#UNDEFINED_GETTER} or
* {@link StaticWarningCode#UNDEFINED_GETTER} would have been generated, if we used propagated
* information for the warnings.
*
* @param getterName the name of the getter
* @param enclosingType the name of the enclosing type where the getter is being looked for
* @see StaticTypeWarningCode#UNDEFINED_GETTER
* @see StaticWarningCode#UNDEFINED_GETTER
*/
UNDEFINED_GETTER("There is no such getter '%s' in '%s'"),
/**
* This hint is generated anywhere where the {@link StaticTypeWarningCode#UNDEFINED_METHOD} would
* have been generated, if we used propagated information for the warnings.
*
* @param methodName the name of the method that is undefined
* @param typeName the resolved type name that the method lookup is happening on
* @see StaticTypeWarningCode#UNDEFINED_METHOD
*/
UNDEFINED_METHOD("The method '%s' is not defined for the class '%s'"),
/**
* This hint is generated anywhere where the {@link StaticTypeWarningCode#UNDEFINED_OPERATOR}
* would have been generated, if we used propagated information for the warnings.
*
* @param operator the name of the operator
* @param enclosingType the name of the enclosing type where the operator is being looked for
* @see StaticTypeWarningCode#UNDEFINED_OPERATOR
*/
UNDEFINED_OPERATOR("There is no such operator '%s' in '%s'"),
/**
* This hint is generated anywhere where the {@link StaticTypeWarningCode#UNDEFINED_SETTER} or
* {@link StaticWarningCode#UNDEFINED_SETTER} would have been generated, if we used propagated
* information for the warnings.
*
* @param setterName the name of the setter
* @param enclosingType the name of the enclosing type where the setter is being looked for
* @see StaticTypeWarningCode#UNDEFINED_SETTER
* @see StaticWarningCode#UNDEFINED_SETTER
*/
UNDEFINED_SETTER("There is no such setter '%s' in '%s'"),
/**
* Unnecessary cast.
*/
UNNECESSARY_CAST("Unnecessary cast"),
/**
* Unnecessary type checks, the result is always true.
*/
UNNECESSARY_TYPE_CHECK_FALSE("Unnecessary type check, the result is always false"),
/**
* Unnecessary type checks, the result is always false.
*/
UNNECESSARY_TYPE_CHECK_TRUE("Unnecessary type check, the result is always true"),
/**
* Unused imports are imports which are never not used.
*/
UNUSED_IMPORT("Unused import"),
/**
* Hint for cases where the source expects a method or function to return a non-void result, but
* the method or function signature returns void.
*
* @param name the name of the method or function that returns void
*/
USE_OF_VOID_RESULT("The result of '%s' is being used, even though it is declared to be 'void'");
/**
* The template used to create the message to be displayed for this error.
*/
private final String message;
/**
* The template used to create the correction to be displayed for this error, or {@code null} if
* there is no correction information for this error.
*/
public String correction;
/**
* Initialize a newly created error code to have the given message.
*
* @param message the message template used to create the message to be displayed for the error
*/
private HintCode(String message) {
this(message, null);
}
/**
* Initialize a newly created error code to have the given message and correction.
*
* @param message the template used to create the message to be displayed for the error
* @param correction the template used to create the correction to be displayed for the error
*/
private HintCode(String message, String correction) {
this.message = message;
this.correction = correction;
}
@Override
public String getCorrection() {
return correction;
}
@Override
public ErrorSeverity getErrorSeverity() {
return ErrorType.HINT.getSeverity();
}
@Override
public String getMessage() {
return message;
}
@Override
public ErrorType getType() {
return ErrorType.HINT;
}
@Override
public String getUniqueName() {
return getClass().getSimpleName() + '.' + name();
}
}