diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeFieldSignatureData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeFieldSignatureData.java index 232770a4b6b..d79d3b0c21a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeFieldSignatureData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeFieldSignatureData.java @@ -17,7 +17,7 @@ package org.jetbrains.jet.lang.resolve.java.kotlinSignature; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.PsiClass; import com.intellij.util.containers.ComparatorUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; @@ -34,23 +34,22 @@ public class AlternativeFieldSignatureData extends ElementAlternativeSignatureDa private JetType altReturnType; - public AlternativeFieldSignatureData(@NotNull PsiFieldWrapper field, @NotNull JetType originalReturnType) { + public AlternativeFieldSignatureData(@NotNull PsiFieldWrapper field, @NotNull JetType originalReturnType, boolean isVar) { String signature = field.getSignatureAnnotation().signature(); - JetProperty altPropertyDeclaration; + this.field = field; + if (signature.isEmpty()) { setAnnotated(false); - this.field = null; return; } setAnnotated(true); - this.field = field; Project project = field.getPsiMember().getProject(); - altPropertyDeclaration = JetPsiFactory.createProperty(project, signature); + JetProperty altPropertyDeclaration = JetPsiFactory.createProperty(project, signature); try { checkForSyntaxErrors(altPropertyDeclaration); - checkEqualNames(altPropertyDeclaration, field); + checkFieldAnnotation(altPropertyDeclaration, field, isVar); altReturnType = computeReturnType(originalReturnType, altPropertyDeclaration.getTypeRef(), new HashMap()); } @@ -70,11 +69,35 @@ public class AlternativeFieldSignatureData extends ElementAlternativeSignatureDa return field.getPsiField().getText(); } - private static void checkEqualNames(PsiNamedElement namedElement, PsiFieldWrapper fieldWrapper) { - if (!ComparatorUtil.equalsNullable(fieldWrapper.getName(), namedElement.getName())) { + private static void checkFieldAnnotation(JetProperty altProperty, PsiFieldWrapper fieldWrapper, boolean isVar) { + PsiClass containingClass = fieldWrapper.getPsiField().getContainingClass(); + String fieldLink = containingClass != null ? + String.format("%s.%s", containingClass.getQualifiedName(), fieldWrapper.getName()) : + fieldWrapper.getName(); + assert (fieldLink != null); + + if (!ComparatorUtil.equalsNullable(fieldWrapper.getName(), altProperty.getName())) { throw new AlternativeSignatureMismatchException( "Field name mismatch, original: %s, alternative: %s", - fieldWrapper.getName(), namedElement.getName()); + fieldLink, altProperty.getName()); + } + + if (altProperty.getTypeRef() == null) { + throw new AlternativeSignatureMismatchException( + "Field annotation for '%s' shouldn't have type reference", + fieldLink); + } + + if (altProperty.getGetter() != null || altProperty.getSetter() != null) { + throw new AlternativeSignatureMismatchException( + "Field annotation for '%s' shouldn't have getters and setters", + fieldLink); + } + + if (altProperty.isVar() != isVar) { + throw new AlternativeSignatureMismatchException( + "Wrong mutability in annotation for field '%s'", + fieldLink); } } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/PropertiesResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/PropertiesResolver.java index 9341092d896..147f4b25189 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/PropertiesResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/PropertiesResolver.java @@ -230,7 +230,7 @@ public final class PropertiesResolver { if (characteristicMember.isField()) { AlternativeFieldSignatureData signatureData = - new AlternativeFieldSignatureData((PsiFieldWrapper) characteristicMember.getMember(), propertyType); + new AlternativeFieldSignatureData((PsiFieldWrapper) characteristicMember.getMember(), propertyType, isVar); if (!signatureData.hasErrors()) { if (signatureData.isAnnotated()) { propertyType = signatureData.getReturnType(); diff --git a/compiler/testData/loadJava/kotlinSignature/PropertySimpleType.java b/compiler/testData/loadJava/kotlinSignature/PropertySimpleType.java index cab744f8f6e..c0c882140d6 100644 --- a/compiler/testData/loadJava/kotlinSignature/PropertySimpleType.java +++ b/compiler/testData/loadJava/kotlinSignature/PropertySimpleType.java @@ -20,7 +20,7 @@ import java.lang.String; import jet.runtime.typeinfo.KotlinSignature; public class PropertySimpleType { - @KotlinSignature("val fieldOne : String") + @KotlinSignature("var fieldOne : String") public String fieldOne; @KotlinSignature("var fieldTwo : String?") diff --git a/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.java b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.java new file mode 100644 index 00000000000..318731787ec --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.java @@ -0,0 +1,10 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +import java.lang.String; + +public class ExplicitFieldGettersAndSetters { + @KotlinSignature("var foo: String get() { return \"hello\" }") + public String foo; +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.kt b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.kt new file mode 100644 index 00000000000..3efc998fc56 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class ExplicitFieldGettersAndSetters : Object() { + public var foo : String? = "" +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.txt b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.txt new file mode 100644 index 00000000000..5b12c27e109 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.ExplicitFieldGettersAndSetters : java.lang.Object { + public final /*constructor*/ fun (): test.ExplicitFieldGettersAndSetters + public final var foo: jet.String? +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.java b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.java new file mode 100644 index 00000000000..aa6ee47bf5e --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.java @@ -0,0 +1,10 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +import java.lang.String; + +public class NoFieldTypeRef { + @KotlinSignature("var foo") + public String foo; +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.kt b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.kt new file mode 100644 index 00000000000..132aeee7af1 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class NoFieldTypeRef : Object() { + public var foo : String? = "" +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.txt b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.txt new file mode 100644 index 00000000000..811c5088edb --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.NoFieldTypeRef : java.lang.Object { + public final /*constructor*/ fun (): test.NoFieldTypeRef + public final var foo: jet.String? +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.java b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.java new file mode 100644 index 00000000000..812d623c724 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.java @@ -0,0 +1,13 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +import java.lang.String; + +public class WrongFieldMutability { + @KotlinSignature("val fooNotFinal : String") + public String fooNotFinal; + + @KotlinSignature("var fooFinal : String") + public final String fooFinal = "Test"; +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.kt b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.kt new file mode 100644 index 00000000000..95219dd537b --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.kt @@ -0,0 +1,8 @@ +package test + +import java.util.* + +public open class WrongFieldMutability : Object() { + public var fooNotFinal : String? = "" + public val fooFinal : String? = "" +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.txt b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.txt new file mode 100644 index 00000000000..8b41d9f2e56 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.txt @@ -0,0 +1,7 @@ +namespace test + +public open class test.WrongFieldMutability : java.lang.Object { + public final /*constructor*/ fun (): test.WrongFieldMutability + public final val fooFinal: jet.String? + public final var fooNotFinal: jet.String? +} diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java index fbfee28fb3d..ff96c6906c7 100644 --- a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java @@ -5,6 +5,6 @@ import jet.runtime.typeinfo.KotlinSignature; import java.lang.String; public class WrongFieldName { - @KotlinSignature("val bar: String") + @KotlinSignature("var bar: String") public String foo; } diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt index 0f73bc557fb..932a1fdd1da 100644 --- a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt @@ -3,5 +3,5 @@ package test import java.util.* public open class WrongFieldName : Object() { - public val foo : String? = "" + public var foo : String? = "" } diff --git a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.txt b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.txt index 058116c5377..18dae02ce7a 100644 --- a/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.txt +++ b/compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.txt @@ -2,5 +2,5 @@ namespace test public open class test.WrongFieldName : java.lang.Object { public final /*constructor*/ fun (): test.WrongFieldName - public final val foo: jet.String? + public final var foo: jet.String? } diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index dd40989025f..0e0604566f9 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -308,6 +308,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.jvm.compiler.AbstractLoadJavaTest", new File("compiler/testData/loadJava/kotlinSignature/error"), "java", true); } + @TestMetadata("ExplicitFieldGettersAndSetters.java") + public void testExplicitFieldGettersAndSetters() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.java"); + } + @TestMetadata("ExtraUpperBound.java") public void testExtraUpperBound() throws Exception { doTest("compiler/testData/loadJava/kotlinSignature/error/ExtraUpperBound.java"); @@ -318,6 +323,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTest("compiler/testData/loadJava/kotlinSignature/error/MissingUpperBound.java"); } + @TestMetadata("NoFieldTypeRef.java") + public void testNoFieldTypeRef() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.java"); + } + @TestMetadata("NotVarargReplacedWithVararg.java") public void testNotVarargReplacedWithVararg() throws Exception { doTest("compiler/testData/loadJava/kotlinSignature/error/NotVarargReplacedWithVararg.java"); @@ -338,6 +348,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTest("compiler/testData/loadJava/kotlinSignature/error/VarargReplacedWithNotVararg.java"); } + @TestMetadata("WrongFieldMutability.java") + public void testWrongFieldMutability() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.java"); + } + @TestMetadata("WrongFieldName.java") public void testWrongFieldName() throws Exception { doTest("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index a1778a957ac..ca031161c9a 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1193,6 +1193,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/loadJava/kotlinSignature/error"), "kt", true); } + @TestMetadata("ExplicitFieldGettersAndSetters.kt") + public void testExplicitFieldGettersAndSetters() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/ExplicitFieldGettersAndSetters.kt"); + } + @TestMetadata("ExtraUpperBound.kt") public void testExtraUpperBound() throws Exception { doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/ExtraUpperBound.kt"); @@ -1203,6 +1208,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/MissingUpperBound.kt"); } + @TestMetadata("NoFieldTypeRef.kt") + public void testNoFieldTypeRef() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/NoFieldTypeRef.kt"); + } + @TestMetadata("NotVarargReplacedWithVararg.kt") public void testNotVarargReplacedWithVararg() throws Exception { doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/NotVarargReplacedWithVararg.kt"); @@ -1223,6 +1233,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/VarargReplacedWithNotVararg.kt"); } + @TestMetadata("WrongFieldMutability.kt") + public void testWrongFieldMutability() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/WrongFieldMutability.kt"); + } + @TestMetadata("WrongFieldName.kt") public void testWrongFieldName() throws Exception { doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt");