Do not include annotations and KDoc into NO_EXPLICIT_VISIBILITY_IN_API_MODE report range
Rename positioning strategy to better reflect its behavior. #KT-36021 fixed.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -208,9 +208,10 @@ public interface Errors {
|
|||||||
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
|
||||||
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, KtModifierKeywordToken> DEPRECATED_MODIFIER = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, KtModifierKeywordToken> DEPRECATED_MODIFIER = DiagnosticFactory2.create(WARNING);
|
||||||
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> REDUNDANT_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> REDUNDANT_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
|
||||||
DiagnosticFactory0<KtDeclaration> NO_EXPLICIT_VISIBILITY_IN_API_MODE = DiagnosticFactory0.create(ERROR, DECLARATION_MODIFIERS_AND_NAME);
|
DiagnosticFactory0<KtDeclaration> NO_EXPLICIT_VISIBILITY_IN_API_MODE = DiagnosticFactory0.create(ERROR, DECLARATION_START_TO_NAME);
|
||||||
DiagnosticFactory0<KtNamedDeclaration> NO_EXPLICIT_RETURN_TYPE_IN_API_MODE = DiagnosticFactory0.create(ERROR, DECLARATION_NAME);
|
DiagnosticFactory0<KtNamedDeclaration> NO_EXPLICIT_RETURN_TYPE_IN_API_MODE = DiagnosticFactory0.create(ERROR, DECLARATION_NAME);
|
||||||
DiagnosticFactory0<KtDeclaration> NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_MODIFIERS_AND_NAME);
|
DiagnosticFactory0<KtDeclaration> NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING = DiagnosticFactory0.create(WARNING,
|
||||||
|
DECLARATION_START_TO_NAME);
|
||||||
DiagnosticFactory0<KtNamedDeclaration> NO_EXPLICIT_RETURN_TYPE_IN_API_MODE_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_NAME);
|
DiagnosticFactory0<KtNamedDeclaration> NO_EXPLICIT_RETURN_TYPE_IN_API_MODE_WARNING = DiagnosticFactory0.create(WARNING, DECLARATION_NAME);
|
||||||
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> WRONG_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(ERROR);
|
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> WRONG_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(ERROR);
|
||||||
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(WARNING);
|
||||||
|
|||||||
@@ -1,24 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2017 JetBrains s.r.o.
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
*
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* 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 org.jetbrains.kotlin.diagnostics
|
package org.jetbrains.kotlin.diagnostics
|
||||||
|
|
||||||
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.PsiNameIdentifierOwner
|
import com.intellij.psi.PsiNameIdentifierOwner
|
||||||
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.cfg.UnreachableCode
|
import org.jetbrains.kotlin.cfg.UnreachableCode
|
||||||
@@ -189,9 +180,27 @@ object PositioningStrategies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val DECLARATION_MODIFIERS_AND_NAME: PositioningStrategy<KtDeclaration> = object : DeclarationHeader<KtDeclaration>() {
|
val DECLARATION_START_TO_NAME: PositioningStrategy<KtDeclaration> = object : DeclarationHeader<KtDeclaration>() {
|
||||||
|
|
||||||
|
private fun PsiElement.firstNonCommentNonAnnotationLeaf(): PsiElement? {
|
||||||
|
var child: PsiElement? = firstChild ?: return this // this is leaf
|
||||||
|
while (true) {
|
||||||
|
if (child is PsiComment || child is PsiWhiteSpace || child is KtAnnotationEntry) {
|
||||||
|
child = child.nextSibling
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (child == null) return null // no children of accepted type in this
|
||||||
|
val leaf = child.firstNonCommentNonAnnotationLeaf()
|
||||||
|
if (leaf == null) {
|
||||||
|
child = child.nextSibling
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return leaf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun mark(element: KtDeclaration): List<TextRange> {
|
override fun mark(element: KtDeclaration): List<TextRange> {
|
||||||
val startElement = element.firstChild
|
val startElement = element.firstNonCommentNonAnnotationLeaf() ?: element
|
||||||
val nameIdentifier = (element as? KtNamedDeclaration)?.nameIdentifier
|
val nameIdentifier = (element as? KtNamedDeclaration)?.nameIdentifier
|
||||||
return if (nameIdentifier != null) {
|
return if (nameIdentifier != null) {
|
||||||
markRange(startElement, nameIdentifier)
|
markRange(startElement, nameIdentifier)
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
// SKIP_TXT
|
||||||
|
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>annotation class A<!>
|
||||||
|
|
||||||
|
@Target(
|
||||||
|
AnnotationTarget.CLASS,
|
||||||
|
AnnotationTarget.PROPERTY,
|
||||||
|
AnnotationTarget.CONSTRUCTOR,
|
||||||
|
AnnotationTarget.FUNCTION
|
||||||
|
)
|
||||||
|
public annotation class B
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Foo1 KDoc
|
||||||
|
*/
|
||||||
|
@B
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>class Foo1<!>() {}
|
||||||
|
|
||||||
|
public class Foo2() {
|
||||||
|
/**
|
||||||
|
* KDoc for methodWithAnnotations
|
||||||
|
*/
|
||||||
|
@B
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun methodWithAnnotations<!>() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property KDoc
|
||||||
|
*/
|
||||||
|
@B
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>var simple<!>: Int = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class ClassWithOpen {
|
||||||
|
/**
|
||||||
|
* constructor KDoc
|
||||||
|
*/
|
||||||
|
@B
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>constructor<!>() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KDoc for openAnnotatedMethod
|
||||||
|
*/
|
||||||
|
@B
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>open fun openAnnotatedMethod<!>() {}
|
||||||
|
}
|
||||||
@@ -1,9 +1,19 @@
|
|||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KDoc for Foo1
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>class Foo1<!>() {}
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>class Foo1<!>() {}
|
||||||
|
|
||||||
public class Foo2() {
|
public class Foo2() {
|
||||||
|
/**
|
||||||
|
* KDoc for method
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun method<!>() {}
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun method<!>() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KDoc for method2
|
||||||
|
*/
|
||||||
public fun method2() {}
|
public fun method2() {}
|
||||||
private fun method3() {}
|
private fun method3() {}
|
||||||
|
|
||||||
@@ -12,6 +22,18 @@ public class Foo2() {
|
|||||||
public fun implicit3(): Int = 10
|
public fun implicit3(): Int = 10
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public open class ClassWithOpen() {
|
||||||
|
/**
|
||||||
|
* KDoc for method
|
||||||
|
*/
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun method<!>() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KDoc for openMethod
|
||||||
|
*/
|
||||||
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>open fun openMethod<!>() {}
|
||||||
|
}
|
||||||
|
|
||||||
public data class FooData(val i: Int, val s: String)
|
public data class FooData(val i: Int, val s: String)
|
||||||
|
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>data class FooData2<!>(val i: Int, val s: String)
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>data class FooData2<!>(val i: Int, val s: String)
|
||||||
|
|||||||
@@ -9,5 +9,8 @@ public class Bar2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class Bar3 {
|
public class Bar3 {
|
||||||
|
/**
|
||||||
|
* Nested object KDoc
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>object NestedObject<!> {}
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>object NestedObject<!> {}
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,9 @@ public class Foo3 public constructor() {}
|
|||||||
public class Foo4 private constructor() {}
|
public class Foo4 private constructor() {}
|
||||||
|
|
||||||
public class Foo5 {
|
public class Foo5 {
|
||||||
|
/**
|
||||||
|
* constructor KDoc
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>constructor<!>() {}
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>constructor<!>() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
public class Foo(<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>val bar<!>: Int, private var bar2: String, internal var bar3: Long, public var bar4: Int) {
|
public class Foo(<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>val bar<!>: Int, private var bar2: String, internal var bar3: Long, public var bar4: Int) {
|
||||||
|
/**
|
||||||
|
* Property KDoc
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>var simple<!>: Int = 10
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>var simple<!>: Int = 10
|
||||||
public var simple2: Int = 10
|
public var simple2: Int = 10
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* foo KDoc
|
||||||
|
*/
|
||||||
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun foo<!>() {}
|
<!NO_EXPLICIT_VISIBILITY_IN_API_MODE!>fun foo<!>() {}
|
||||||
|
|
||||||
public fun foo2() {}
|
public fun foo2() {}
|
||||||
|
|||||||
+5
@@ -28,6 +28,11 @@ public class DiagnosticsWithExplicitApiGenerated extends AbstractDiagnosticsWith
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithExplicitApi"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithExplicitApi"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotations.kt")
|
||||||
|
public void testAnnotations() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithExplicitApi/annotations.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("classes.kt")
|
@TestMetadata("classes.kt")
|
||||||
public void testClasses() throws Exception {
|
public void testClasses() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithExplicitApi/classes.kt");
|
runTest("compiler/testData/diagnostics/testsWithExplicitApi/classes.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user