From e119ca27ca49a280ab04a57f781de8e7b50c5f6f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 5 Feb 2014 09:34:55 +0100 Subject: [PATCH] AnnotationLoadingUtil created. Relevant code/constants moved there --- .../resolve/java/AnnotationLoadingUtil.java | 43 +++++++++++++++++++ .../lang/resolve/java/lazy/annotationUtils.kt | 10 ++--- .../LazyJavaAnnotationDescriptor.kt | 11 +++-- .../java/mapping/JavaToKotlinClassMap.java | 4 +- .../JavaAnnotationArgumentResolver.java | 1 - .../java/resolver/JavaAnnotationResolver.java | 12 ------ .../AnnotationDescriptorDeserializer.java | 6 +-- .../DeprecatedAnnotationVisitor.java | 4 +- 8 files changed, 60 insertions(+), 31 deletions(-) create mode 100644 core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/AnnotationLoadingUtil.java diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/AnnotationLoadingUtil.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/AnnotationLoadingUtil.java new file mode 100644 index 00000000000..c5294611947 --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/AnnotationLoadingUtil.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2014 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.jet.lang.resolve.java; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; + +import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.fqNameByClass; + +public final class AnnotationLoadingUtil { + public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); + public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = fqNameByClass(NotNull.class); + public static final FqName JETBRAINS_NULLABLE_ANNOTATION = fqNameByClass(Nullable.class); + public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); + public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); + public static final FqName JL_CLASS_FQ_NAME = new FqName("java.lang.Class"); + + public static boolean isSpecialAnnotation(@NotNull FqName fqName) { + return fqName.asString().startsWith("jet.runtime.typeinfo.") + || fqName.equals(JETBRAINS_NOT_NULL_ANNOTATION) + || fqName.equals(JvmAnnotationNames.KOTLIN_CLASS) + || fqName.equals(JvmAnnotationNames.KOTLIN_PACKAGE); + } + + private AnnotationLoadingUtil() {} +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/annotationUtils.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/annotationUtils.kt index a207ae64678..d33292a0cb4 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/annotationUtils.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/annotationUtils.kt @@ -19,16 +19,16 @@ package org.jetbrains.jet.lang.resolve.java.lazy import org.jetbrains.jet.lang.resolve.java.structure.JavaAnnotation import org.jetbrains.jet.lang.resolve.java.structure.JavaAnnotationOwner import org.jetbrains.jet.lang.resolve.name.FqName -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver import org.jetbrains.jet.lang.descriptors.annotations.Annotations import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaAnnotationDescriptor +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil class LazyJavaAnnotations(c: LazyJavaResolverContextWithTypes, val annotationOwner: JavaAnnotationOwner) : Annotations { private val annotationDescriptors = c.storageManager.createMemoizedFunctionWithNullableValues { (jAnnotation: JavaAnnotation) -> val fqName = jAnnotation.getFqName() - if (fqName == null || JavaAnnotationResolver.isSpecialAnnotation(fqName)) { + if (fqName == null || AnnotationLoadingUtil.isSpecialAnnotation(fqName)) { null } else LazyJavaAnnotationDescriptor(c, jAnnotation) @@ -54,6 +54,6 @@ fun LazyJavaResolverContextWithTypes.resolveAnnotations(annotationsOwner: JavaAn private fun GlobalJavaResolverContext.hasAnnotation(owner: JavaAnnotationOwner, annotationFqName: FqName): Boolean = owner.findAnnotation(annotationFqName) != null || externalAnnotationResolver.findExternalAnnotation(owner, annotationFqName) != null -fun GlobalJavaResolverContext.hasMutableAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JavaAnnotationResolver.JETBRAINS_MUTABLE_ANNOTATION) -fun GlobalJavaResolverContext.hasReadOnlyAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JavaAnnotationResolver.JETBRAINS_READONLY_ANNOTATION) -fun GlobalJavaResolverContext.hasNotNullAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JavaAnnotationResolver.JETBRAINS_NOT_NULL_ANNOTATION) \ No newline at end of file +fun GlobalJavaResolverContext.hasMutableAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, AnnotationLoadingUtil.JETBRAINS_MUTABLE_ANNOTATION) +fun GlobalJavaResolverContext.hasReadOnlyAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, AnnotationLoadingUtil.JETBRAINS_READONLY_ANNOTATION) +fun GlobalJavaResolverContext.hasNotNullAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, AnnotationLoadingUtil.JETBRAINS_NOT_NULL_ANNOTATION) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt index 81597f8ebc5..2fce1296cbe 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt @@ -13,8 +13,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.VariableDescriptor -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver.* +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil.* import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import org.jetbrains.jet.lang.resolve.DescriptorUtils @@ -30,11 +29,11 @@ import org.jetbrains.jet.utils.valuesToMap import org.jetbrains.jet.utils.keysToMap import org.jetbrains.jet.utils.keysToMapExceptNulls import org.jetbrains.jet.lang.resolve.java.lazy.types.toAttributes -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap import org.jetbrains.jet.lang.types.TypeUtils import org.jetbrains.jet.lang.resolve.java.resolver.resolveCompileTimeConstantValue +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument { override fun getName(): Name? = null @@ -70,7 +69,7 @@ class LazyJavaAnnotationDescriptor( val nameToArg = _nameToArgument() var javaAnnotationArgument = nameToArg[valueParameter.getName()] - if (javaAnnotationArgument == null && valueParameter.getName() == JavaAnnotationResolver.DEFAULT_ANNOTATION_MEMBER_NAME) { + if (javaAnnotationArgument == null && valueParameter.getName() == DEFAULT_ANNOTATION_MEMBER_NAME) { javaAnnotationArgument = nameToArg[null] } @@ -108,7 +107,7 @@ class LazyJavaAnnotationDescriptor( val fqName = javaAnnotation.getFqName() if (fqName == null) return null - if (JavaAnnotationResolver.isSpecialAnnotation(fqName)) { + if (AnnotationLoadingUtil.isSpecialAnnotation(fqName)) { return null } @@ -147,7 +146,7 @@ class LazyJavaAnnotationDescriptor( private fun resolveFromJavaClassObjectType(javaType: JavaType): CompileTimeConstant<*>? { // Class type is never nullable in 'Foo.class' in Java val `type` = TypeUtils.makeNotNullable(c.typeResolver.transformJavaType(javaType, TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes())) - val jlClass = c.javaClassResolver.resolveClassByFqName(JavaAnnotationArgumentResolver.JL_CLASS_FQ_NAME) + val jlClass = c.javaClassResolver.resolveClassByFqName(JL_CLASS_FQ_NAME) if (jlClass == null) return null val arguments = listOf(TypeProjectionImpl(`type`)) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java index 89f481ed3f8..06d62aacc1a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java @@ -24,11 +24,11 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; @@ -109,7 +109,7 @@ public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements AnnotationDescriptorImpl annotation = new AnnotationDescriptorImpl(); annotation.setAnnotationType(annotationClass.getDefaultType()); ValueParameterDescriptor value = DescriptorResolverUtils.getAnnotationParameterByName( - JavaAnnotationResolver.DEFAULT_ANNOTATION_MEMBER_NAME, annotationClass); + AnnotationLoadingUtil.DEFAULT_ANNOTATION_MEMBER_NAME, annotationClass); assert value != null : "jet.deprecated must have one parameter called value"; annotation.setValueArgument(value, new StringValue("Deprecated in Java", true)); return annotation; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationArgumentResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationArgumentResolver.java index d6f93836768..e453fb2198e 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationArgumentResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationArgumentResolver.java @@ -40,7 +40,6 @@ import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KO import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_KOTLIN_SOURCES; public final class JavaAnnotationArgumentResolver { - public static final FqName JL_CLASS_FQ_NAME = new FqName("java.lang.Class"); private JavaAnnotationResolver annotationResolver; private JavaClassResolver classResolver; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationResolver.java index 95113b8885c..b2415796c2f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaAnnotationResolver.java @@ -42,11 +42,6 @@ import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_K import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.fqNameByClass; public final class JavaAnnotationResolver { - public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); - public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = fqNameByClass(NotNull.class); - public static final FqName JETBRAINS_NULLABLE_ANNOTATION = fqNameByClass(Nullable.class); - public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); - public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); private JavaClassResolver classResolver; private JavaAnnotationArgumentResolver argumentResolver; @@ -145,13 +140,6 @@ public final class JavaAnnotationResolver { return annotation; } - public static boolean isSpecialAnnotation(@NotNull FqName fqName) { - return fqName.asString().startsWith("jet.runtime.typeinfo.") - || fqName.equals(JETBRAINS_NOT_NULL_ANNOTATION) - || fqName.equals(JvmAnnotationNames.KOTLIN_CLASS) - || fqName.equals(JvmAnnotationNames.KOTLIN_PACKAGE); - } - @Nullable public JavaAnnotation findAnnotationWithExternal(@NotNull JavaAnnotationOwner owner, @NotNull FqName name) { JavaAnnotation annotation = owner.findAnnotation(name); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java index 3839577e4cb..38c41ef79dd 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl; import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationsImpl; +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.EnumValue; @@ -38,7 +39,6 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.ResolverPackage; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -151,8 +151,8 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer private static boolean ignoreAnnotation(@NotNull JvmClassName className) { return className.equals(JvmClassName.byFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS)) || className.equals(JvmClassName.byFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE)) - || className.equals(JvmClassName.byFqNameWithoutInnerClasses(JavaAnnotationResolver.JETBRAINS_NOT_NULL_ANNOTATION)) - || className.equals(JvmClassName.byFqNameWithoutInnerClasses(JavaAnnotationResolver.JETBRAINS_NULLABLE_ANNOTATION)) + || className.equals(JvmClassName.byFqNameWithoutInnerClasses(AnnotationLoadingUtil.JETBRAINS_NOT_NULL_ANNOTATION)) + || className.equals(JvmClassName.byFqNameWithoutInnerClasses(AnnotationLoadingUtil.JETBRAINS_NULLABLE_ANNOTATION)) || className.getInternalName().startsWith("jet/runtime/typeinfo/"); } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java b/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java index 4e663ac0c71..80fc6265ff3 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java @@ -33,8 +33,8 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.java.AnnotationLoadingUtil; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; @@ -232,7 +232,7 @@ public class DeprecatedAnnotationVisitor extends AfterAnalysisHighlightingVisito ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(descriptor.getType()); assert classDescriptor != null : "ClassDescriptor for jet.deprecated mustn't be null"; ValueParameterDescriptor parameter = DescriptorResolverUtils.getAnnotationParameterByName( - JavaAnnotationResolver.DEFAULT_ANNOTATION_MEMBER_NAME, classDescriptor); + AnnotationLoadingUtil.DEFAULT_ANNOTATION_MEMBER_NAME, classDescriptor); assert parameter != null : "jet.deprecated must have one parameter called value"; CompileTimeConstant valueArgument = descriptor.getValueArgument(parameter); assert valueArgument != null : "jet.deprecated must have value argument";