diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategy.java index 87309804184..67501f2190f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategy.java @@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; +import com.intellij.psi.PsiWhiteSpace; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -42,12 +44,12 @@ public class PositioningStrategy { @NotNull protected static List markElement(@NotNull PsiElement element) { - return Collections.singletonList(element.getTextRange()); + return Collections.singletonList(new TextRange(getStartOffset(element), getEndOffset(element))); } @NotNull protected static List markNode(@NotNull ASTNode node) { - return Collections.singletonList(node.getTextRange()); + return markElement(node.getPsi()); } @NotNull @@ -57,7 +59,33 @@ public class PositioningStrategy { @NotNull protected static List 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) { diff --git a/compiler/testData/codegen/box/functions/tailRecursion/recursiveCallInLambda.kt b/compiler/testData/codegen/box/functions/tailRecursion/recursiveCallInLambda.kt index 9f5d624d630..f46d34487a8 100644 --- a/compiler/testData/codegen/box/functions/tailRecursion/recursiveCallInLambda.kt +++ b/compiler/testData/codegen/box/functions/tailRecursion/recursiveCallInLambda.kt @@ -1,5 +1,4 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER - tailRecursive fun foo() { bar { foo() diff --git a/compiler/testData/diagnostics/tests/Abstract.kt b/compiler/testData/diagnostics/tests/Abstract.kt index 0a42057b9f6..57d1c773dec 100644 --- a/compiler/testData/diagnostics/tests/Abstract.kt +++ b/compiler/testData/diagnostics/tests/Abstract.kt @@ -1,7 +1,6 @@ // FILE: b.kt package MyPackage //properties - val a: Int val a1: Int = 1 abstract val a2: Int @@ -23,14 +22,12 @@ package MyPackage abstract val e3: Int = 0; get() = a //methods - fun f() fun g() {} abstract fun h() abstract fun j() {} //property accessors - var i: Int abstract get abstract set var i1: Int = 0; abstract get abstract set diff --git a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt index 3085f0e022e..218bb40075e 100644 --- a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt +++ b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt @@ -2,7 +2,6 @@ package abstract abstract class MyAbstractClass() { //properties - val a: Int val a1: Int = 1 abstract val a2: Int @@ -24,14 +23,12 @@ abstract class MyAbstractClass() { abstract val e3: Int = 0; get() = a //methods - fun f() fun g() {} abstract fun h() abstract fun j() {} //property accessors - var i: Int abstract get abstract set var i1: Int = 0; abstract get abstract set diff --git a/compiler/testData/diagnostics/tests/AbstractInClass.kt b/compiler/testData/diagnostics/tests/AbstractInClass.kt index 4a8557137b4..587fbecf3e6 100644 --- a/compiler/testData/diagnostics/tests/AbstractInClass.kt +++ b/compiler/testData/diagnostics/tests/AbstractInClass.kt @@ -2,7 +2,6 @@ package abstract class MyClass() { //properties - val a: Int val a1: Int = 1 abstract val a2: Int @@ -24,14 +23,12 @@ class MyClass() { abstract val e3: Int = 0; get() = a //methods - fun f() fun g() {} abstract fun h() abstract fun j() {} //property accessors - var i: Int abstract get abstract set var i1: Int = 0; abstract get abstract set diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/phantomClashWithSamAdapter.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/phantomClashWithSamAdapter.kt index 3efdcca174e..846e44e0a95 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/phantomClashWithSamAdapter.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/phantomClashWithSamAdapter.kt @@ -23,6 +23,6 @@ import p.* open class K0 : Foo() class K : K0() { - // We keep this test to make sure ACCIDENTAL_OVERRIDE is not reported - fun foo(f: () -> Unit) {} + // We keep this test to make sure ACCIDENTAL_OVERRIDE is not reported + fun foo(f: () -> Unit) {} } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelDifferentFiles.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelDifferentFiles.kt index bdc79d29d01..b0c6420a9c5 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelDifferentFiles.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelDifferentFiles.kt @@ -1,7 +1,5 @@ // FILE: a.kt - val x = 1 // FILE: b.kt - fun getX() = 1 \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt index 038bf6d234f..fe330dd5291 100644 --- a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt +++ b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt @@ -3,7 +3,6 @@ package abstract enum class MyEnum() { //properties - val a: Int val a1: Int = 1 abstract val a2: Int @@ -25,14 +24,12 @@ enum class MyEnum() { abstract val e3: Int = 0; get() = a //methods - fun f() fun g() {} abstract fun h() abstract fun j() {} //property accessors - var i: Int abstract get abstract set var i1: Int = 0; abstract get abstract set