Delete IdeaJdkAnnotationsReflectedTest
Kotlin JDK annotations are empty now
This commit is contained in:
-187
@@ -1,187 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2015 JetBrains s.r.o.
|
||||
*
|
||||
* 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.jvm.compiler;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.codeInsight.AnnotationUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.util.PsiFormatUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.kotlin.asJava.KotlinLightClass;
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.CoreExternalAnnotationsManager;
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
|
||||
import org.jetbrains.kotlin.name.FqName;
|
||||
import org.jetbrains.kotlin.resolve.lazy.KotlinTestWithEnvironment;
|
||||
import org.jetbrains.kotlin.resolve.lazy.LazyResolveTestUtil;
|
||||
import org.jetbrains.kotlin.test.ConfigurationKind;
|
||||
import org.jetbrains.kotlin.test.JetTestUtils;
|
||||
import org.jetbrains.kotlin.test.TestJdkKind;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class IdeaJdkAnnotationsReflectedTest extends KotlinTestWithEnvironment {
|
||||
private VirtualFile kotlinAnnotationsRoot;
|
||||
private VirtualFile ideaAnnotationsRoot;
|
||||
|
||||
@Override
|
||||
protected KotlinCoreEnvironment createEnvironment() {
|
||||
KotlinCoreEnvironment environment = JetTestUtils.createEnvironmentWithJdkAndNullabilityAnnotationsFromIdea(
|
||||
myTestRootDisposable, ConfigurationKind.JDK_AND_ANNOTATIONS, TestJdkKind.FULL_JDK);
|
||||
|
||||
// Activate Kotlin light class finder
|
||||
LazyResolveTestUtil.resolveProject(environment.getProject());
|
||||
|
||||
return environment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
kotlinAnnotationsRoot = VirtualFileManager.getInstance().findFileByUrl("jar://dependencies/annotations/kotlin-jdk-annotations.jar!/");
|
||||
ideaAnnotationsRoot = VirtualFileManager.getInstance().findFileByUrl("jar://ideaSDK/lib/jdkAnnotations.jar!/");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
ideaAnnotationsRoot = null;
|
||||
kotlinAnnotationsRoot = null;
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
private CoreExternalAnnotationsManager createFakeAnnotationsManager(VirtualFile annotationsRoot) {
|
||||
CoreExternalAnnotationsManager annotationsManager = new CoreExternalAnnotationsManager(PsiManager.getInstance(getProject()));
|
||||
annotationsManager.addExternalAnnotationsRoot(annotationsRoot);
|
||||
return annotationsManager;
|
||||
}
|
||||
|
||||
public void testAllIdeaJdkAnnotationsAreReflected() {
|
||||
JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(getProject());
|
||||
GlobalSearchScope allScope = GlobalSearchScope.allScope(getProject());
|
||||
|
||||
final CoreExternalAnnotationsManager kotlinFakeAnnotationsManager = createFakeAnnotationsManager(kotlinAnnotationsRoot);
|
||||
final CoreExternalAnnotationsManager ideaFakeAnnotationsManager = createFakeAnnotationsManager(ideaAnnotationsRoot);
|
||||
|
||||
final Set<PsiModifierListOwner> declarationsWithMissingAnnotations = Sets.newLinkedHashSet();
|
||||
|
||||
for (FqName classFqName : JdkAnnotationsValidityTest.getAffectedClasses("jar://ideaSDK/lib/jdkAnnotations.jar!/")) {
|
||||
if (new FqName("org.jdom").equals(classFqName.parent())) continue; // filter unrelated jdom annotations
|
||||
if (new FqName("java.util.concurrent.TransferQueue").equals(classFqName)) continue; // filter JDK7-specific class
|
||||
if (new FqName("java.util.Objects").equals(classFqName)) continue; // filter JDK7-specific class
|
||||
if (new FqName("java.nio.file.Files").equals(classFqName)) continue; // filter JDK7-specific class
|
||||
if (new FqName("java.nio.file.Paths").equals(classFqName)) continue; // filter JDK7-specific class
|
||||
// the following idea annotation is incorrect
|
||||
// <item name="java.io.StringWriter void write(java.lang.String) 0">
|
||||
// <annotation name="org.jetbrains.annotations.NotNull" />
|
||||
// </item>
|
||||
if (new FqName("java.io.StringWriter").equals(classFqName)) continue;
|
||||
|
||||
PsiClass psiClass = javaPsiFacade.findClass(classFqName.asString(), allScope);
|
||||
assertNotNull("Class has annotation, but it is not found: " + classFqName, psiClass);
|
||||
|
||||
assertFalse("Kotlin light classes are not not expected", psiClass instanceof KotlinLightClass);
|
||||
|
||||
psiClass.accept(new JavaRecursiveElementVisitor() {
|
||||
@Override
|
||||
public void visitMethod(@NotNull PsiMethod method) {
|
||||
super.visitMethod(method);
|
||||
if (method.getReturnType() != null) { // disabled for constructors
|
||||
checkAndReport(method);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitField(@NotNull PsiField field) {
|
||||
super.visitField(field);
|
||||
checkAndReport(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitParameter(@NotNull PsiParameter parameter) {
|
||||
super.visitParameter(parameter);
|
||||
PsiMethod method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class);
|
||||
assert method != null;
|
||||
if (method.getReturnType() != null) { // disabled for constructors
|
||||
if (!check(parameter, method, AnnotationsKind.KOTLIN_SIGNATURE) &&
|
||||
!check(parameter, parameter, AnnotationsKind.NOT_NULL)) {
|
||||
declarationsWithMissingAnnotations.add(parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkAndReport(@NotNull PsiModifierListOwner annotationOwner) {
|
||||
if (!check(annotationOwner, annotationOwner, AnnotationsKind.ANY)) {
|
||||
declarationsWithMissingAnnotations.add(annotationOwner);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean check(
|
||||
@NotNull PsiModifierListOwner ideaOwner,
|
||||
@NotNull PsiModifierListOwner kotlinOwner,
|
||||
@NotNull AnnotationsKind annotationsKind
|
||||
) {
|
||||
return !hasAnnotationInIdea(ideaOwner) || hasAnnotationInKotlin(kotlinOwner, annotationsKind);
|
||||
}
|
||||
|
||||
private boolean hasAnnotationInIdea(@NotNull PsiModifierListOwner owner) {
|
||||
return hasAnnotation(ideaFakeAnnotationsManager, owner, AnnotationUtil.NOT_NULL);
|
||||
}
|
||||
|
||||
private boolean hasAnnotationInKotlin(@NotNull PsiModifierListOwner owner, @NotNull AnnotationsKind annotationsKind) {
|
||||
for (String name : annotationsKind.annotationNames) {
|
||||
if (hasAnnotation(kotlinFakeAnnotationsManager, owner, name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean hasAnnotation(
|
||||
@NotNull CoreExternalAnnotationsManager annotationsManager,
|
||||
@NotNull PsiModifierListOwner owner,
|
||||
@NotNull String annotationFqName
|
||||
) {
|
||||
return annotationsManager.findExternalAnnotation(owner, annotationFqName) != null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!declarationsWithMissingAnnotations.isEmpty()) {
|
||||
StringBuilder builder = new StringBuilder("Annotations missing for JDK items:\n");
|
||||
for (PsiModifierListOwner declaration : declarationsWithMissingAnnotations) {
|
||||
builder.append(PsiFormatUtil.getExternalName(declaration)).append("\n");
|
||||
}
|
||||
fail(builder.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private enum AnnotationsKind {
|
||||
KOTLIN_SIGNATURE(JvmAnnotationNames.KOTLIN_SIGNATURE.asString(), JvmAnnotationNames.OLD_KOTLIN_SIGNATURE.asString()),
|
||||
NOT_NULL(AnnotationUtil.NOT_NULL),
|
||||
ANY(AnnotationUtil.NOT_NULL, JvmAnnotationNames.KOTLIN_SIGNATURE.asString(), JvmAnnotationNames.OLD_KOTLIN_SIGNATURE.asString());
|
||||
|
||||
public final String[] annotationNames;
|
||||
|
||||
AnnotationsKind(@NotNull String... annotationNames) {
|
||||
this.annotationNames = annotationNames;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user