More validation checks for field annotations
This commit is contained in:
+33
-10
@@ -17,7 +17,7 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.java.kotlinSignature;
|
package org.jetbrains.jet.lang.resolve.java.kotlinSignature;
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.psi.PsiNamedElement;
|
import com.intellij.psi.PsiClass;
|
||||||
import com.intellij.util.containers.ComparatorUtil;
|
import com.intellij.util.containers.ComparatorUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
@@ -34,23 +34,22 @@ public class AlternativeFieldSignatureData extends ElementAlternativeSignatureDa
|
|||||||
|
|
||||||
private JetType altReturnType;
|
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();
|
String signature = field.getSignatureAnnotation().signature();
|
||||||
JetProperty altPropertyDeclaration;
|
this.field = field;
|
||||||
|
|
||||||
if (signature.isEmpty()) {
|
if (signature.isEmpty()) {
|
||||||
setAnnotated(false);
|
setAnnotated(false);
|
||||||
this.field = null;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setAnnotated(true);
|
setAnnotated(true);
|
||||||
this.field = field;
|
|
||||||
Project project = field.getPsiMember().getProject();
|
Project project = field.getPsiMember().getProject();
|
||||||
altPropertyDeclaration = JetPsiFactory.createProperty(project, signature);
|
JetProperty altPropertyDeclaration = JetPsiFactory.createProperty(project, signature);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkForSyntaxErrors(altPropertyDeclaration);
|
checkForSyntaxErrors(altPropertyDeclaration);
|
||||||
checkEqualNames(altPropertyDeclaration, field);
|
checkFieldAnnotation(altPropertyDeclaration, field, isVar);
|
||||||
altReturnType = computeReturnType(originalReturnType, altPropertyDeclaration.getTypeRef(),
|
altReturnType = computeReturnType(originalReturnType, altPropertyDeclaration.getTypeRef(),
|
||||||
new HashMap<TypeParameterDescriptor, TypeParameterDescriptorImpl>());
|
new HashMap<TypeParameterDescriptor, TypeParameterDescriptorImpl>());
|
||||||
}
|
}
|
||||||
@@ -70,11 +69,35 @@ public class AlternativeFieldSignatureData extends ElementAlternativeSignatureDa
|
|||||||
return field.getPsiField().getText();
|
return field.getPsiField().getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkEqualNames(PsiNamedElement namedElement, PsiFieldWrapper fieldWrapper) {
|
private static void checkFieldAnnotation(JetProperty altProperty, PsiFieldWrapper fieldWrapper, boolean isVar) {
|
||||||
if (!ComparatorUtil.equalsNullable(fieldWrapper.getName(), namedElement.getName())) {
|
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(
|
throw new AlternativeSignatureMismatchException(
|
||||||
"Field name mismatch, original: %s, alternative: %s",
|
"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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -230,7 +230,7 @@ public final class PropertiesResolver {
|
|||||||
|
|
||||||
if (characteristicMember.isField()) {
|
if (characteristicMember.isField()) {
|
||||||
AlternativeFieldSignatureData signatureData =
|
AlternativeFieldSignatureData signatureData =
|
||||||
new AlternativeFieldSignatureData((PsiFieldWrapper) characteristicMember.getMember(), propertyType);
|
new AlternativeFieldSignatureData((PsiFieldWrapper) characteristicMember.getMember(), propertyType, isVar);
|
||||||
if (!signatureData.hasErrors()) {
|
if (!signatureData.hasErrors()) {
|
||||||
if (signatureData.isAnnotated()) {
|
if (signatureData.isAnnotated()) {
|
||||||
propertyType = signatureData.getReturnType();
|
propertyType = signatureData.getReturnType();
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import java.lang.String;
|
|||||||
import jet.runtime.typeinfo.KotlinSignature;
|
import jet.runtime.typeinfo.KotlinSignature;
|
||||||
|
|
||||||
public class PropertySimpleType {
|
public class PropertySimpleType {
|
||||||
@KotlinSignature("val fieldOne : String")
|
@KotlinSignature("var fieldOne : String")
|
||||||
public String fieldOne;
|
public String fieldOne;
|
||||||
|
|
||||||
@KotlinSignature("var fieldTwo : String?")
|
@KotlinSignature("var fieldTwo : String?")
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
public open class ExplicitFieldGettersAndSetters : Object() {
|
||||||
|
public var foo : String? = ""
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace test
|
||||||
|
|
||||||
|
public open class test.ExplicitFieldGettersAndSetters : java.lang.Object {
|
||||||
|
public final /*constructor*/ fun <init>(): test.ExplicitFieldGettersAndSetters
|
||||||
|
public final var foo: jet.String?
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import jet.runtime.typeinfo.KotlinSignature;
|
||||||
|
|
||||||
|
import java.lang.String;
|
||||||
|
|
||||||
|
public class NoFieldTypeRef {
|
||||||
|
@KotlinSignature("var foo")
|
||||||
|
public String foo;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
public open class NoFieldTypeRef : Object() {
|
||||||
|
public var foo : String? = ""
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace test
|
||||||
|
|
||||||
|
public open class test.NoFieldTypeRef : java.lang.Object {
|
||||||
|
public final /*constructor*/ fun <init>(): test.NoFieldTypeRef
|
||||||
|
public final var foo: jet.String?
|
||||||
|
}
|
||||||
@@ -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";
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
public open class WrongFieldMutability : Object() {
|
||||||
|
public var fooNotFinal : String? = ""
|
||||||
|
public val fooFinal : String? = ""
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace test
|
||||||
|
|
||||||
|
public open class test.WrongFieldMutability : java.lang.Object {
|
||||||
|
public final /*constructor*/ fun <init>(): test.WrongFieldMutability
|
||||||
|
public final val fooFinal: jet.String?
|
||||||
|
public final var fooNotFinal: jet.String?
|
||||||
|
}
|
||||||
@@ -5,6 +5,6 @@ import jet.runtime.typeinfo.KotlinSignature;
|
|||||||
import java.lang.String;
|
import java.lang.String;
|
||||||
|
|
||||||
public class WrongFieldName {
|
public class WrongFieldName {
|
||||||
@KotlinSignature("val bar: String")
|
@KotlinSignature("var bar: String")
|
||||||
public String foo;
|
public String foo;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package test
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
public open class WrongFieldName : Object() {
|
public open class WrongFieldName : Object() {
|
||||||
public val foo : String? = ""
|
public var foo : String? = ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ namespace test
|
|||||||
|
|
||||||
public open class test.WrongFieldName : java.lang.Object {
|
public open class test.WrongFieldName : java.lang.Object {
|
||||||
public final /*constructor*/ fun <init>(): test.WrongFieldName
|
public final /*constructor*/ fun <init>(): test.WrongFieldName
|
||||||
public final val foo: jet.String?
|
public final var foo: jet.String?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
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")
|
@TestMetadata("ExtraUpperBound.java")
|
||||||
public void testExtraUpperBound() throws Exception {
|
public void testExtraUpperBound() throws Exception {
|
||||||
doTest("compiler/testData/loadJava/kotlinSignature/error/ExtraUpperBound.java");
|
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");
|
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")
|
@TestMetadata("NotVarargReplacedWithVararg.java")
|
||||||
public void testNotVarargReplacedWithVararg() throws Exception {
|
public void testNotVarargReplacedWithVararg() throws Exception {
|
||||||
doTest("compiler/testData/loadJava/kotlinSignature/error/NotVarargReplacedWithVararg.java");
|
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");
|
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")
|
@TestMetadata("WrongFieldName.java")
|
||||||
public void testWrongFieldName() throws Exception {
|
public void testWrongFieldName() throws Exception {
|
||||||
doTest("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java");
|
doTest("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.java");
|
||||||
|
|||||||
+15
@@ -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);
|
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")
|
@TestMetadata("ExtraUpperBound.kt")
|
||||||
public void testExtraUpperBound() throws Exception {
|
public void testExtraUpperBound() throws Exception {
|
||||||
doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/ExtraUpperBound.kt");
|
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");
|
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")
|
@TestMetadata("NotVarargReplacedWithVararg.kt")
|
||||||
public void testNotVarargReplacedWithVararg() throws Exception {
|
public void testNotVarargReplacedWithVararg() throws Exception {
|
||||||
doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/NotVarargReplacedWithVararg.kt");
|
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");
|
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")
|
@TestMetadata("WrongFieldName.kt")
|
||||||
public void testWrongFieldName() throws Exception {
|
public void testWrongFieldName() throws Exception {
|
||||||
doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt");
|
doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/error/WrongFieldName.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user