diff --git a/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java new file mode 100644 index 00000000000..97d25bfcd06 --- /dev/null +++ b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java @@ -0,0 +1,42 @@ +/* + * 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.checkers; + +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; +import org.jetbrains.kotlin.test.ConfigurationKind; +import org.jetbrains.kotlin.test.JetTestUtils; +import org.jetbrains.kotlin.test.TestJdkKind; + +import java.io.File; +import java.util.Arrays; + +public abstract class AbstractJetDiagnosticsWithFullJdkTest extends AbstractJetDiagnosticsTest { + @Override + protected KotlinCoreEnvironment createEnvironment() { + File javaFilesDir = createJavaFilesDir(); + return KotlinCoreEnvironment.createForTests(getTestRootDisposable(), + JetTestUtils.compilerConfigurationForTests( + ConfigurationKind.ALL, + TestJdkKind.FULL_JDK, + Arrays.asList(JetTestUtils.getAnnotationsJar()), + Arrays.asList(javaFilesDir) + ), + EnvironmentConfigFiles.JVM_CONFIG_FILES); + } +} + diff --git a/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsWithJava8TestGenerated.java b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsWithJava8TestGenerated.java new file mode 100644 index 00000000000..0365a3591a3 --- /dev/null +++ b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsWithJava8TestGenerated.java @@ -0,0 +1,52 @@ +/* + * 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.checkers; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.JetTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/diagnostics/testsWithJava8") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class JetDiagnosticsWithJava8TestGenerated extends AbstractJetDiagnosticsWithFullJdkTest { + public void testAllFilesPresentInTestsWithJava8() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJava8"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("compiler/testData/diagnostics/testsWithJava8/annotations") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Annotations extends AbstractJetDiagnosticsWithFullJdkTest { + public void testAllFilesPresentInAnnotations() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJava8/annotations"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("javarepeatable.kt") + public void testJavarepeatable() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.kt"); + doTest(fileName); + } + } +} diff --git a/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.kt b/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.kt new file mode 100644 index 00000000000..b624cd332cf --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.kt @@ -0,0 +1,9 @@ +import java.lang.annotation.Repeatable + +@java.lang.annotation.Repeatable(Annotations::class) annotation class RepAnn + +Repeatable(OtherAnnotations::class) annotation class OtherAnn + +annotation class Annotations(vararg val value: RepAnn) + +annotation class OtherAnnotations(vararg val value: OtherAnn) diff --git a/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.txt b/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.txt new file mode 100644 index 00000000000..615fdad00c7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJava8/annotations/javarepeatable.txt @@ -0,0 +1,31 @@ +package + +kotlin.annotation.annotation() internal final class Annotations : kotlin.Annotation { + public constructor Annotations(/*0*/ vararg value: RepAnn /*kotlin.Array*/) + internal final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +java.lang.annotation.Repeatable(value = OtherAnnotations::class) kotlin.annotation.annotation() internal final class OtherAnn : kotlin.Annotation { + public constructor OtherAnn() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +kotlin.annotation.annotation() internal final class OtherAnnotations : kotlin.Annotation { + public constructor OtherAnnotations(/*0*/ vararg value: OtherAnn /*kotlin.Array*/) + internal final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +java.lang.annotation.Repeatable(value = Annotations::class) kotlin.annotation.annotation() internal final class RepAnn : kotlin.Annotation { + public constructor RepAnn() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java new file mode 100644 index 00000000000..97d25bfcd06 --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsWithFullJdkTest.java @@ -0,0 +1,42 @@ +/* + * 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.checkers; + +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; +import org.jetbrains.kotlin.test.ConfigurationKind; +import org.jetbrains.kotlin.test.JetTestUtils; +import org.jetbrains.kotlin.test.TestJdkKind; + +import java.io.File; +import java.util.Arrays; + +public abstract class AbstractJetDiagnosticsWithFullJdkTest extends AbstractJetDiagnosticsTest { + @Override + protected KotlinCoreEnvironment createEnvironment() { + File javaFilesDir = createJavaFilesDir(); + return KotlinCoreEnvironment.createForTests(getTestRootDisposable(), + JetTestUtils.compilerConfigurationForTests( + ConfigurationKind.ALL, + TestJdkKind.FULL_JDK, + Arrays.asList(JetTestUtils.getAnnotationsJar()), + Arrays.asList(javaFilesDir) + ), + EnvironmentConfigFiles.JVM_CONFIG_FILES); + } +} + diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt index 682beff69b9..81ef7ffe64d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt @@ -49,6 +49,8 @@ public object JavaAnnotationMapper { private val javaTargetFqName = FqName(javaClass().canonicalName) private val javaRetentionFqName = FqName(javaClass().canonicalName) private val javaDeprecatedFqName = FqName(javaClass().canonicalName) + // Java8-specific thing + private val javaRepeatableFqName = FqName("java.lang.annotation.Repeatable") public fun mapJavaAnnotation(annotation: JavaAnnotation, c: LazyJavaResolverContext): AnnotationDescriptor? = when (annotation.classId) { @@ -66,7 +68,8 @@ public object JavaAnnotationMapper { public val javaToKotlinNameMap: Map = mapOf(javaTargetFqName to KotlinBuiltIns.FQ_NAMES.target, javaRetentionFqName to KotlinBuiltIns.FQ_NAMES.annotation, - javaDeprecatedFqName to KotlinBuiltIns.FQ_NAMES.deprecated) + javaDeprecatedFqName to KotlinBuiltIns.FQ_NAMES.deprecated, + javaRepeatableFqName to KotlinBuiltIns.FQ_NAMES.annotation) } abstract class AbstractJavaAnnotationDescriptor( diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 1fd974a503d..7a6bee2b3f9 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -320,6 +320,9 @@ fun main(args: Array) { testClass(javaClass(), "BlackBoxWithJava8CodegenTestGenerated") { model("codegen/java8/boxWithJava", testMethod = "doTestWithJava", extension = null, recursive = true, excludeParentDirs = true) } + testClass(javaClass(), "JetDiagnosticsWithJava8TestGenerated") { + model("diagnostics/testsWithJava8") + } }