Highlighting "as Foo" for useless casts in gray.
#KT-6070 fixed
This commit is contained in:
@@ -530,8 +530,8 @@ public interface Errors {
|
|||||||
DiagnosticFactory1<JetElement, JetType> CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<JetElement, JetType> CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory2<JetBinaryExpressionWithTypeRHS, JetType, JetType> UNCHECKED_CAST = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<JetBinaryExpressionWithTypeRHS, JetType, JetType> UNCHECKED_CAST = DiagnosticFactory2.create(WARNING);
|
||||||
|
|
||||||
DiagnosticFactory0<JetSimpleNameExpression> USELESS_CAST_STATIC_ASSERT_IS_FINE = DiagnosticFactory0.create(WARNING);
|
DiagnosticFactory0<JetBinaryExpressionWithTypeRHS> USELESS_CAST_STATIC_ASSERT_IS_FINE = DiagnosticFactory0.create(WARNING, AS_TYPE);
|
||||||
DiagnosticFactory0<JetSimpleNameExpression> USELESS_CAST = DiagnosticFactory0.create(WARNING);
|
DiagnosticFactory0<JetBinaryExpressionWithTypeRHS> USELESS_CAST = DiagnosticFactory0.create(WARNING, AS_TYPE);
|
||||||
DiagnosticFactory0<JetSimpleNameExpression> CAST_NEVER_SUCCEEDS = DiagnosticFactory0.create(WARNING);
|
DiagnosticFactory0<JetSimpleNameExpression> CAST_NEVER_SUCCEEDS = DiagnosticFactory0.create(WARNING);
|
||||||
DiagnosticFactory0<JetTypeReference> DYNAMIC_NOT_ALLOWED = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<JetTypeReference> DYNAMIC_NOT_ALLOWED = DiagnosticFactory0.create(ERROR);
|
||||||
|
|
||||||
@@ -631,7 +631,7 @@ public interface Errors {
|
|||||||
INVISIBLE_MEMBER, INVISIBLE_MEMBER_FROM_INLINE, INVISIBLE_REFERENCE, INVISIBLE_SETTER);
|
INVISIBLE_MEMBER, INVISIBLE_MEMBER_FROM_INLINE, INVISIBLE_REFERENCE, INVISIBLE_SETTER);
|
||||||
ImmutableSet<? extends DiagnosticFactory<?>> UNUSED_ELEMENT_DIAGNOSTICS = ImmutableSet.of(
|
ImmutableSet<? extends DiagnosticFactory<?>> UNUSED_ELEMENT_DIAGNOSTICS = ImmutableSet.of(
|
||||||
UNUSED_VARIABLE, UNUSED_PARAMETER, ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, VARIABLE_WITH_REDUNDANT_INITIALIZER,
|
UNUSED_VARIABLE, UNUSED_PARAMETER, ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, VARIABLE_WITH_REDUNDANT_INITIALIZER,
|
||||||
UNUSED_FUNCTION_LITERAL);
|
UNUSED_FUNCTION_LITERAL, USELESS_CAST, USELESS_CAST_STATIC_ASSERT_IS_FINE);
|
||||||
ImmutableSet<? extends DiagnosticFactory<?>> TYPE_INFERENCE_ERRORS = ImmutableSet.of(
|
ImmutableSet<? extends DiagnosticFactory<?>> TYPE_INFERENCE_ERRORS = ImmutableSet.of(
|
||||||
TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER, TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS, TYPE_INFERENCE_TYPE_CONSTRUCTOR_MISMATCH,
|
TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER, TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS, TYPE_INFERENCE_TYPE_CONSTRUCTOR_MISMATCH,
|
||||||
TYPE_INFERENCE_UPPER_BOUND_VIOLATED, TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH);
|
TYPE_INFERENCE_UPPER_BOUND_VIOLATED, TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH);
|
||||||
|
|||||||
@@ -365,4 +365,10 @@ public object PositioningStrategies {
|
|||||||
return Errors.UNREACHABLE_CODE.cast(diagnostic).getA()
|
return Errors.UNREACHABLE_CODE.cast(diagnostic).getA()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public val AS_TYPE: PositioningStrategy<JetBinaryExpressionWithTypeRHS> = object : PositioningStrategy<JetBinaryExpressionWithTypeRHS>() {
|
||||||
|
override fun mark(element: JetBinaryExpressionWithTypeRHS): List<TextRange> {
|
||||||
|
return markRange(element.getOperationReference(), element)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -223,14 +223,14 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
JetTypeChecker typeChecker = JetTypeChecker.DEFAULT;
|
JetTypeChecker typeChecker = JetTypeChecker.DEFAULT;
|
||||||
if (actualType.equals(targetType)) {
|
if (actualType.equals(targetType)) {
|
||||||
// cast to itself: String as String
|
// cast to itself: String as String
|
||||||
context.trace.report(USELESS_CAST.on(expression.getOperationReference()));
|
context.trace.report(USELESS_CAST.on(expression));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Collection<JetType> possibleTypes = DataFlowUtils.getAllPossibleTypes(
|
Collection<JetType> possibleTypes = DataFlowUtils.getAllPossibleTypes(
|
||||||
expression.getLeft(), context.dataFlowInfo, actualType, context.trace.getBindingContext());
|
expression.getLeft(), context.dataFlowInfo, actualType, context.trace.getBindingContext());
|
||||||
for (JetType possibleType : possibleTypes) {
|
for (JetType possibleType : possibleTypes) {
|
||||||
if (typeChecker.isSubtypeOf(possibleType, targetType)) {
|
if (typeChecker.isSubtypeOf(possibleType, targetType)) {
|
||||||
context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression.getOperationReference()));
|
context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ fun test() : Unit {
|
|||||||
x : Int?
|
x : Int?
|
||||||
y : Int
|
y : Int
|
||||||
x as Int : Int
|
x as Int : Int
|
||||||
y <!USELESS_CAST!>as<!> Int : Int
|
y <!USELESS_CAST!>as Int<!> : Int
|
||||||
x <!USELESS_CAST!>as<!> Int? : Int?
|
x <!USELESS_CAST!>as Int?<!> : Int?
|
||||||
y <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> Int? : Int?
|
y <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as Int?<!> : Int?
|
||||||
x as? Int : Int?
|
x as? Int : Int?
|
||||||
y <!USELESS_CAST!>as?<!> Int : Int?
|
y <!USELESS_CAST!>as? Int<!> : Int?
|
||||||
x <!USELESS_CAST!>as?<!> Int? : Int?
|
x <!USELESS_CAST!>as? Int?<!> : Int?
|
||||||
y <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as?<!> Int? : Int?
|
y <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as? Int?<!> : Int?
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ fun test() {
|
|||||||
<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>: Float
|
<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>: Float
|
||||||
|
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
|
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
|
||||||
1 <!USELESS_CAST!>as<!> Int
|
1 <!USELESS_CAST!>as Int<!>
|
||||||
0xff <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
0xff <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
||||||
|
|
||||||
1.1 <!CAST_NEVER_SUCCEEDS!>as<!> Int
|
1.1 <!CAST_NEVER_SUCCEEDS!>as<!> Int
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ fun cannotBe() {
|
|||||||
<!VARIABLE_EXPECTED!>""<!> = "";
|
<!VARIABLE_EXPECTED!>""<!> = "";
|
||||||
<!VARIABLE_EXPECTED!>foo()<!> = Unit;
|
<!VARIABLE_EXPECTED!>foo()<!> = Unit;
|
||||||
|
|
||||||
(<!VARIABLE_EXPECTED!>i <!USELESS_CAST!>as<!> Int<!>) = 34
|
(<!VARIABLE_EXPECTED!>i <!USELESS_CAST!>as Int<!><!>) = 34
|
||||||
(<!VARIABLE_EXPECTED!>i is Int<!>) = false
|
(<!VARIABLE_EXPECTED!>i is Int<!>) = false
|
||||||
<!VARIABLE_EXPECTED!>A()<!> = A()
|
<!VARIABLE_EXPECTED!>A()<!> = A()
|
||||||
<!VARIABLE_EXPECTED!>5<!> = 34
|
<!VARIABLE_EXPECTED!>5<!> = 34
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
class G<T>
|
class G<T>
|
||||||
|
|
||||||
fun foo(p: <!UNRESOLVED_REFERENCE!>P<!>) {
|
fun foo(p: <!UNRESOLVED_REFERENCE!>P<!>) {
|
||||||
val v = <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>p<!> <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> <!NO_TYPE_ARGUMENTS_ON_RHS!>G?<!>
|
val v = <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>p<!> <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as <!NO_TYPE_ARGUMENTS_ON_RHS!>G?<!><!>
|
||||||
v!!: G<*>
|
v!!: G<*>
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class P
|
class P
|
||||||
|
|
||||||
fun foo(p: P): Any {
|
fun foo(p: P): Any {
|
||||||
val v = p <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> <!UNRESOLVED_REFERENCE!>G<!>
|
val v = p <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as <!UNRESOLVED_REFERENCE!>G<!><!>
|
||||||
return <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v<!>
|
return <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v<!>
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fun asCall() {
|
fun asCall() {
|
||||||
1 <!USELESS_CAST!>as<!> Int
|
1 <!USELESS_CAST!>as Int<!>
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
|
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as<!> Short
|
1 <!CAST_NEVER_SUCCEEDS!>as<!> Short
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
1 <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
||||||
@@ -12,7 +12,7 @@ fun asCall() {
|
|||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Short
|
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Short
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Char
|
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Char
|
||||||
1.0 <!USELESS_CAST!>as<!> Double
|
1.0 <!USELESS_CAST!>as Double<!>
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Float
|
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Float
|
||||||
|
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as<!> Int
|
1f <!CAST_NEVER_SUCCEEDS!>as<!> Int
|
||||||
@@ -21,11 +21,11 @@ fun asCall() {
|
|||||||
1f <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
1f <!CAST_NEVER_SUCCEEDS!>as<!> Long
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as<!> Char
|
1f <!CAST_NEVER_SUCCEEDS!>as<!> Char
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as<!> Double
|
1f <!CAST_NEVER_SUCCEEDS!>as<!> Double
|
||||||
1f <!USELESS_CAST!>as<!> Float
|
1f <!USELESS_CAST!>as Float<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
fun asSafe() {
|
fun asSafe() {
|
||||||
1 <!USELESS_CAST!>as?<!> Int
|
1 <!USELESS_CAST!>as? Int<!>
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Byte
|
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Byte
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
|
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
|
||||||
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
||||||
@@ -38,7 +38,7 @@ fun asSafe() {
|
|||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
|
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Char
|
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Char
|
||||||
1.0 <!USELESS_CAST!>as?<!> Double
|
1.0 <!USELESS_CAST!>as? Double<!>
|
||||||
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Float
|
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Float
|
||||||
|
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Int
|
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Int
|
||||||
@@ -47,5 +47,5 @@ fun asSafe() {
|
|||||||
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Long
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Char
|
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Char
|
||||||
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Double
|
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Double
|
||||||
1f <!USELESS_CAST!>as?<!> Float
|
1f <!USELESS_CAST!>as? Float<!>
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,6 @@ fun bar() {
|
|||||||
x.foo()
|
x.foo()
|
||||||
X.foo()
|
X.foo()
|
||||||
(X : C).foo()
|
(X : C).foo()
|
||||||
(X <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> C).foo()
|
(X <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as C<!>).foo()
|
||||||
((if (1<2) X else Y) : C).foo()
|
((if (1<2) X else Y) : C).foo()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ fun f2(s: Number?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun f3(s: Number?) {
|
fun f3(s: Number?) {
|
||||||
if (s is Int && s <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> Int == 42);
|
if (s is Int && s <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as Int<!> == 42);
|
||||||
<!TYPE_MISMATCH!>s<!> : Int
|
<!TYPE_MISMATCH!>s<!> : Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,6 @@ fun f4(a: Any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun f5(a: String) {
|
fun f5(a: String) {
|
||||||
a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> Any?
|
a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as Any?<!>
|
||||||
a: String
|
a: String
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
//KT-5455 Need warning about redundant type cast
|
//KT-5455 Need warning about redundant type cast
|
||||||
fun foo(o: Any): Int {
|
fun foo(o: Any): Int {
|
||||||
if (o is String) {
|
if (o is String) {
|
||||||
return (o <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String).length()
|
return (o <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String<!>).length()
|
||||||
}
|
}
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
@@ -13,16 +13,16 @@ class B: A()
|
|||||||
|
|
||||||
fun test(a: Any?) {
|
fun test(a: Any?) {
|
||||||
if (a is B) {
|
if (a is B) {
|
||||||
(a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> A).foo()
|
(a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as A<!>).foo()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test1(a: B) {
|
fun test1(a: B) {
|
||||||
(a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> A?)?.foo()
|
(a <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as A?<!>)?.foo()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2(b: B?) {
|
fun test2(b: B?) {
|
||||||
if (b != null) {
|
if (b != null) {
|
||||||
(b <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> A).foo()
|
(b <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as A<!>).foo()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
class C {
|
class C {
|
||||||
suppress("UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
class C {
|
class C {
|
||||||
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
class object {
|
class object {
|
||||||
val foo: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
val foo: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
fun foo(): Any? {
|
fun foo(): Any? {
|
||||||
[suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")]
|
[suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")]
|
||||||
return ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
return ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
object C {
|
object C {
|
||||||
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
fun foo(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
fun foo(suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION") p: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??) = p
|
fun foo(suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION") p: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>) = p
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")
|
||||||
val foo: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
val foo: String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
class C {
|
class C {
|
||||||
val foo: String?
|
val foo: String?
|
||||||
[suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")]
|
[suppress("REDUNDANT_NULLABLE", "UNNECESSARY_NOT_NULL_ASSERTION")]
|
||||||
get(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as<!> String??
|
get(): String?? = ""!! <!USELESS_CAST_STATIC_ASSERT_IS_FINE!>as String??<!>
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
class C {
|
class C {
|
||||||
fun foo(): String?? = null <!USELESS_CAST!>as<!> Nothing??
|
fun foo(): String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
class object {
|
class object {
|
||||||
val foo: String?? = null <!USELESS_CAST!>as<!> Nothing??
|
val foo: String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
fun foo(): Any? {
|
fun foo(): Any? {
|
||||||
[suppress("REDUNDANT_NULLABLE")]
|
[suppress("REDUNDANT_NULLABLE")]
|
||||||
return null <!USELESS_CAST!>as<!> Nothing??
|
return null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
fun foo(): String?? = null <!USELESS_CAST!>as<!> Nothing??
|
fun foo(): String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
class C {
|
class C {
|
||||||
fun foo(): Any? {
|
fun foo(): Any? {
|
||||||
[suppress("REDUNDANT_NULLABLE")]
|
[suppress("REDUNDANT_NULLABLE")]
|
||||||
val v: String?? = null <!USELESS_CAST!>as<!> Nothing??
|
val v: String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
object C {
|
object C {
|
||||||
fun foo(): String?? = null <!USELESS_CAST!>as<!> Nothing??
|
fun foo(): String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
fun foo(suppress("REDUNDANT_NULLABLE") p: String?? = null <!USELESS_CAST!>as<!> Nothing??) = p
|
fun foo(suppress("REDUNDANT_NULLABLE") p: String?? = null <!USELESS_CAST!>as Nothing??<!>) = p
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
class C {
|
class C {
|
||||||
suppress("REDUNDANT_NULLABLE")
|
suppress("REDUNDANT_NULLABLE")
|
||||||
val foo: String?? = null <!USELESS_CAST!>as<!> Nothing?
|
val foo: String?? = null <!USELESS_CAST!>as Nothing?<!>
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
class C {
|
class C {
|
||||||
val foo: String?
|
val foo: String?
|
||||||
[suppress("REDUNDANT_NULLABLE")]
|
[suppress("REDUNDANT_NULLABLE")]
|
||||||
get(): String?? = null <!USELESS_CAST!>as<!> Nothing??
|
get(): String?? = null <!USELESS_CAST!>as Nothing??<!>
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,7 @@ import org.jetbrains.jet.plugin.caches.resolve.*
|
|||||||
import org.jetbrains.jet.plugin.quickfix.JetIntentionActionsFactory
|
import org.jetbrains.jet.plugin.quickfix.JetIntentionActionsFactory
|
||||||
import org.jetbrains.jet.plugin.quickfix.QuickFixes
|
import org.jetbrains.jet.plugin.quickfix.QuickFixes
|
||||||
import kotlin.platform.platformStatic
|
import kotlin.platform.platformStatic
|
||||||
|
import org.jetbrains.jet.lang.psi.JetBinaryExpressionWithTypeRHS
|
||||||
|
|
||||||
public open class JetPsiChecker : Annotator, HighlightRangeExtension {
|
public open class JetPsiChecker : Annotator, HighlightRangeExtension {
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ fun test() : Unit {
|
|||||||
x : Int?
|
x : Int?
|
||||||
y : Int
|
y : Int
|
||||||
x as Int : Int
|
x as Int : Int
|
||||||
y <warning>as</warning> Int : Int
|
y <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as Int</warning> : Int
|
||||||
x <warning>as</warning> Int? : Int?
|
x <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as Int?</warning> : Int?
|
||||||
y <warning>as</warning> Int? : Int?
|
y <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as Int?</warning> : Int?
|
||||||
x as? Int : Int?
|
x as? Int : Int?
|
||||||
y <warning>as?</warning> Int : Int?
|
y <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as? Int</warning> : Int?
|
||||||
x <warning>as?</warning> Int? : Int?
|
x <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as? Int?</warning> : Int?
|
||||||
y <warning>as?</warning> Int? : Int?
|
y <warning textAttributesKey="NOT_USED_ELEMENT_ATTRIBUTES">as? Int?</warning> : Int?
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ fun test() {
|
|||||||
1 : Int
|
1 : Int
|
||||||
<error>1</error> : Double
|
<error>1</error> : Double
|
||||||
1 <warning>as</warning> Byte
|
1 <warning>as</warning> Byte
|
||||||
1 <warning>as</warning> Int
|
1 <warning>as Int</warning>
|
||||||
1 <warning>as</warning> Double
|
1 <warning>as</warning> Double
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user