diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 3c60c60a936..9b6041483be 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -479,7 +479,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private void generateFunctionsForDataClasses() { - if (!KotlinBuiltIns.isData(descriptor)) return; + if (!descriptor.isData()) return; new DataClassMethodGeneratorImpl(myClass, bindingContext).generate(); } @@ -763,8 +763,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { new DefaultParameterValueLoader() { @Override public StackValue genValue(ValueParameterDescriptor valueParameter, ExpressionCodegen codegen) { - assert KotlinBuiltIns.isData((ClassDescriptor) function.getContainingDeclaration()) - : "Function container should be annotated with [data]: " + function; + assert ((ClassDescriptor) function.getContainingDeclaration()).isData() + : "Function container must have [data] modifier: " + function; PropertyDescriptor property = bindingContext.get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, valueParameter); assert property != null : "Copy function doesn't correspond to any property: " + function; return codegen.intermediateValueForProperty(property, false, null, StackValue.LOCAL_0); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java index 65a98753ee1..b7f19ca7ce3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java @@ -218,7 +218,7 @@ public interface JetTokens { // Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES JetModifierKeywordToken[] ANNOTATION_MODIFIERS_KEYWORDS_ARRAY = new JetModifierKeywordToken[] { - DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD + INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD }; TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassAnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassAnnotationChecker.kt index 979a162523c..05673d15831 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassAnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DataClassAnnotationChecker.kt @@ -16,10 +16,12 @@ package org.jetbrains.kotlin.resolve -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.diagnostics.* -import org.jetbrains.kotlin.builtins.* +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.diagnostics.DiagnosticSink +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.JetClassOrObject +import org.jetbrains.kotlin.psi.JetDeclaration public class DataClassAnnotationChecker : DeclarationChecker { @@ -32,7 +34,7 @@ public class DataClassAnnotationChecker : DeclarationChecker { if (descriptor !is ClassDescriptor) return if (declaration !is JetClassOrObject) return - if (KotlinBuiltIns.isData(descriptor)) { + if (descriptor.isData) { if (descriptor.unsubstitutedPrimaryConstructor == null && descriptor.constructors.isNotEmpty()) { declaration.nameIdentifier?.let { diagnosticHolder.report(Errors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS.on(it)) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index 94a36ad7b05..06d55d2b298 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -31,9 +31,7 @@ import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ReadOnly; -import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.JetTokens; import org.jetbrains.kotlin.name.Name; @@ -733,7 +731,7 @@ public class OverrideResolver { } private void checkOverrideForComponentFunction(@NotNull final CallableMemberDescriptor componentFunction) { - final PsiElement dataAnnotation = findDataAnnotationForDataClass(componentFunction.getContainingDeclaration()); + final PsiElement dataModifier = findDataModifierForDataClass(componentFunction.getContainingDeclaration()); checkOverridesForMemberMarkedOverride(componentFunction, false, new CheckOverrideReportStrategy() { private boolean overrideConflict = false; @@ -742,7 +740,7 @@ public class OverrideResolver { public void overridingFinalMember(@NotNull CallableMemberDescriptor overridden) { if (!overrideConflict) { overrideConflict = true; - trace.report(DATA_CLASS_OVERRIDE_CONFLICT.on(dataAnnotation, componentFunction, overridden.getContainingDeclaration())); + trace.report(DATA_CLASS_OVERRIDE_CONFLICT.on(dataModifier, componentFunction, overridden.getContainingDeclaration())); } } @@ -750,7 +748,7 @@ public class OverrideResolver { public void returnTypeMismatchOnOverride(@NotNull CallableMemberDescriptor overridden) { if (!overrideConflict) { overrideConflict = true; - trace.report(DATA_CLASS_OVERRIDE_CONFLICT.on(dataAnnotation, componentFunction, overridden.getContainingDeclaration())); + trace.report(DATA_CLASS_OVERRIDE_CONFLICT.on(dataModifier, componentFunction, overridden.getContainingDeclaration())); } } @@ -777,16 +775,7 @@ public class OverrideResolver { } @NotNull - private static PsiElement findDataAnnotationForDataClass(@NotNull DeclarationDescriptor dataClass) { - AnnotationDescriptor annotation = dataClass.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.data); - if (annotation != null) { - JetAnnotationEntry entry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation); - if (entry != null) { - return entry; - } - } - - + private static PsiElement findDataModifierForDataClass(@NotNull DeclarationDescriptor dataClass) { JetClass classDeclaration = (JetClass) DescriptorToSourceUtils.getSourceFromDescriptor(dataClass); if (classDeclaration != null && classDeclaration.getModifierList() != null) { PsiElement modifier = classDeclaration.getModifierList().getModifier(JetTokens.DATA_KEYWORD); @@ -795,7 +784,7 @@ public class OverrideResolver { } } - throw new IllegalStateException("No data annotation is found for data class " + dataClass); + throw new IllegalStateException("No data modifier is found for data class " + dataClass); } @Nullable diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index 976a246773e..12d5f0170be 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.resolve.lazy.descriptors import com.google.common.collect.Lists -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE @@ -136,7 +135,7 @@ public open class LazyClassMemberScope( } private fun generateDataClassMethods(result: MutableCollection, name: Name, location: LookupLocation) { - if (!KotlinBuiltIns.isData(thisDescriptor)) return + if (!thisDescriptor.isData) return val constructor = getPrimaryConstructor() ?: return @@ -243,7 +242,7 @@ public open class LazyClassMemberScope( } private fun addDataClassMethods(result: MutableCollection, location: LookupLocation) { - if (!KotlinBuiltIns.isData(thisDescriptor)) return + if (!thisDescriptor.isData) return if (getPrimaryConstructor() == null) return diff --git a/core/builtins/src/kotlin/Annotations.kt b/core/builtins/src/kotlin/Annotations.kt index 709bf3b50cd..6eadfc1dc48 100644 --- a/core/builtins/src/kotlin/Annotations.kt +++ b/core/builtins/src/kotlin/Annotations.kt @@ -20,16 +20,6 @@ import kotlin.annotation.AnnotationRetention.BINARY import kotlin.annotation.AnnotationRetention.SOURCE import kotlin.annotation.AnnotationTarget.* -/** - * Marks the annotated class as a data class. The compiler automatically generates - * equals()/hashCode(), toString(), componentN() and copy() functions for data classes. - * See [the Kotlin language documentation](http://kotlinlang.org/docs/reference/data-classes.html) - * for more information. - */ -@Target(CLASS) -@MustBeDocumented -private annotation class data - /** * Marks the annotated class, function, property, variable or parameter as deprecated. * @property message the message explaining the deprecation and recommending an alternative API to use. diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index a49f0b24ffe..f037615e2c1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -138,7 +138,6 @@ public abstract class KotlinBuiltIns { public final FqName throwable = fqName("Throwable"); - public final FqName data = fqName("data"); public final FqName deprecated = fqName("Deprecated"); public final FqName tailRecursive = fqName("tailrec"); public final FqName inline = fqName("inline"); @@ -1029,10 +1028,6 @@ public abstract class KotlinBuiltIns { return FQ_NAMES.cloneable.equals(getFqName(descriptor)); } - public static boolean isData(@NotNull ClassDescriptor classDescriptor) { - return containsAnnotation(classDescriptor, FQ_NAMES.data); - } - public static boolean isDeprecated(@NotNull DeclarationDescriptor declarationDescriptor) { return containsAnnotation(declarationDescriptor, FQ_NAMES.deprecated); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt index dbe702a4070..0d077c9505a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/annotationUtil.kt @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.types.Variance // Please synchronize this set with JetTokens.ANNOTATION_MODIFIERS_KEYWORDS_ARRAY public val ANNOTATION_MODIFIERS_FQ_NAMES: Set = - arrayOf("data", "inline", "noinline", "tailrec", "external", "annotation.annotation", "crossinline").map { FqName("kotlin.$it") }.toSet() + arrayOf("inline", "noinline", "tailrec", "external", "annotation.annotation", "crossinline").map { FqName("kotlin.$it") }.toSet() public fun KotlinBuiltIns.createDeprecatedAnnotation(message: String, replaceWith: String): AnnotationDescriptor { val deprecatedAnnotation = deprecatedAnnotation diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 4e12ae168db..f7c54f91906 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -112,7 +112,7 @@ public class ClassTranslator private constructor( bodyVisitor.traverseContainer(classDeclaration, context) delegationTranslator.generateDelegated(properties) - if (KotlinBuiltIns.isData(descriptor)) { + if (descriptor.isData) { JsDataClassGenerator(classDeclaration, context, properties).generate() }