Highlighting ranges should never include comments before/after element
This commit is contained in:
@@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.diagnostics;
|
|||||||
|
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
import com.intellij.openapi.util.TextRange;
|
import com.intellij.openapi.util.TextRange;
|
||||||
|
import com.intellij.psi.PsiComment;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiErrorElement;
|
import com.intellij.psi.PsiErrorElement;
|
||||||
|
import com.intellij.psi.PsiWhiteSpace;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -42,12 +44,12 @@ public class PositioningStrategy<E extends PsiElement> {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected static List<TextRange> markElement(@NotNull PsiElement element) {
|
protected static List<TextRange> markElement(@NotNull PsiElement element) {
|
||||||
return Collections.singletonList(element.getTextRange());
|
return Collections.singletonList(new TextRange(getStartOffset(element), getEndOffset(element)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected static List<TextRange> markNode(@NotNull ASTNode node) {
|
protected static List<TextRange> markNode(@NotNull ASTNode node) {
|
||||||
return Collections.singletonList(node.getTextRange());
|
return markElement(node.getPsi());
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -57,7 +59,33 @@ public class PositioningStrategy<E extends PsiElement> {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected static List<TextRange> markRange(@NotNull PsiElement from, @NotNull PsiElement to) {
|
protected static List<TextRange> markRange(@NotNull PsiElement from, @NotNull PsiElement to) {
|
||||||
return markRange(new TextRange(from.getTextRange().getStartOffset(), to.getTextRange().getEndOffset()));
|
return markRange(new TextRange(getStartOffset(from), getEndOffset(to)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getStartOffset(@NotNull PsiElement element) {
|
||||||
|
PsiElement child = element.getFirstChild();
|
||||||
|
if (child != null) {
|
||||||
|
while (child instanceof PsiComment || child instanceof PsiWhiteSpace) {
|
||||||
|
child = child.getNextSibling();
|
||||||
|
}
|
||||||
|
if (child != null) {
|
||||||
|
return getStartOffset(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return element.getTextRange().getStartOffset();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getEndOffset(@NotNull PsiElement element) {
|
||||||
|
PsiElement child = element.getLastChild();
|
||||||
|
if (child != null) {
|
||||||
|
while (child instanceof PsiComment || child instanceof PsiWhiteSpace) {
|
||||||
|
child = child.getPrevSibling();
|
||||||
|
}
|
||||||
|
if (child != null) {
|
||||||
|
return getEndOffset(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return element.getTextRange().getEndOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static boolean hasSyntaxErrors(@NotNull PsiElement psiElement) {
|
protected static boolean hasSyntaxErrors(@NotNull PsiElement psiElement) {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
<!NO_TAIL_CALLS_FOUND!>tailRecursive fun foo()<!> {
|
<!NO_TAIL_CALLS_FOUND!>tailRecursive fun foo()<!> {
|
||||||
bar {
|
bar {
|
||||||
<!NON_TAIL_RECURSIVE_CALL!>foo<!>()
|
<!NON_TAIL_RECURSIVE_CALL!>foo<!>()
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// FILE: b.kt
|
// FILE: b.kt
|
||||||
package MyPackage
|
package MyPackage
|
||||||
//properties
|
//properties
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED!>val a: Int<!>
|
<!MUST_BE_INITIALIZED!>val a: Int<!>
|
||||||
val a1: Int = 1
|
val a1: Int = 1
|
||||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> val a2: Int<!>
|
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> val a2: Int<!>
|
||||||
@@ -23,14 +22,12 @@ package MyPackage
|
|||||||
<!ILLEGAL_MODIFIER!>abstract<!> val e3: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
<!ILLEGAL_MODIFIER!>abstract<!> val e3: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
|
|
||||||
<!NON_MEMBER_FUNCTION_NO_BODY!>fun f()<!>
|
<!NON_MEMBER_FUNCTION_NO_BODY!>fun f()<!>
|
||||||
fun g() {}
|
fun g() {}
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> fun h()
|
<!ILLEGAL_MODIFIER!>abstract<!> fun h()
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> fun j() {}
|
<!ILLEGAL_MODIFIER!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
|
|
||||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package abstract
|
|||||||
|
|
||||||
abstract class MyAbstractClass() {
|
abstract class MyAbstractClass() {
|
||||||
//properties
|
//properties
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
||||||
val a1: Int = 1
|
val a1: Int = 1
|
||||||
abstract val a2: Int
|
abstract val a2: Int
|
||||||
@@ -24,14 +23,12 @@ abstract class MyAbstractClass() {
|
|||||||
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
|
|
||||||
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
||||||
fun g() {}
|
fun g() {}
|
||||||
abstract fun h()
|
abstract fun h()
|
||||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
|
|
||||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package abstract
|
|||||||
|
|
||||||
class MyClass() {
|
class MyClass() {
|
||||||
//properties
|
//properties
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
||||||
val a1: Int = 1
|
val a1: Int = 1
|
||||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val a2: Int
|
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val a2: Int
|
||||||
@@ -24,14 +23,12 @@ class MyClass() {
|
|||||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val e3: Int = 0; get() = a
|
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val e3: Int = 0; get() = a
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
|
|
||||||
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
||||||
fun g() {}
|
fun g() {}
|
||||||
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS!>abstract<!> fun h()
|
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS!>abstract<!> fun h()
|
||||||
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
|
|
||||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -23,6 +23,6 @@ import p.*
|
|||||||
open class K0 : Foo()
|
open class K0 : Foo()
|
||||||
|
|
||||||
class K : K0() {
|
class K : K0() {
|
||||||
<!VIRTUAL_MEMBER_HIDDEN!>// We keep this test to make sure ACCIDENTAL_OVERRIDE is not reported
|
// We keep this test to make sure ACCIDENTAL_OVERRIDE is not reported
|
||||||
fun <!CANNOT_WEAKEN_ACCESS_PRIVILEGE!>foo<!>(f: () -> Unit)<!> {}
|
<!VIRTUAL_MEMBER_HIDDEN!>fun <!CANNOT_WEAKEN_ACCESS_PRIVILEGE!>foo<!>(f: () -> Unit)<!> {}
|
||||||
}
|
}
|
||||||
-2
@@ -1,7 +1,5 @@
|
|||||||
// FILE: a.kt
|
// FILE: a.kt
|
||||||
|
|
||||||
<!CONFLICTING_JVM_DECLARATIONS!>val x<!> = 1
|
<!CONFLICTING_JVM_DECLARATIONS!>val x<!> = 1
|
||||||
|
|
||||||
// FILE: b.kt
|
// FILE: b.kt
|
||||||
|
|
||||||
<!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1
|
<!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1
|
||||||
@@ -3,7 +3,6 @@ package abstract
|
|||||||
|
|
||||||
enum class MyEnum() {
|
enum class MyEnum() {
|
||||||
//properties
|
//properties
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val a: Int<!>
|
||||||
val a1: Int = 1
|
val a1: Int = 1
|
||||||
abstract val a2: Int
|
abstract val a2: Int
|
||||||
@@ -25,14 +24,12 @@ enum class MyEnum() {
|
|||||||
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
|
|
||||||
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
<!NON_ABSTRACT_FUNCTION_WITH_NO_BODY!>fun f()<!>
|
||||||
fun g() {}
|
fun g() {}
|
||||||
abstract fun h()
|
abstract fun h()
|
||||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
|
|
||||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user