001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.load.java; 018 019 import kotlin.KotlinPackage; 020 import org.jetbrains.annotations.NotNull; 021 import org.jetbrains.kotlin.name.ClassId; 022 import org.jetbrains.kotlin.name.FqName; 023 import org.jetbrains.kotlin.name.Name; 024 import org.jetbrains.kotlin.resolve.jvm.JvmClassName; 025 026 import java.util.Arrays; 027 import java.util.HashSet; 028 import java.util.Set; 029 030 public final class JvmAnnotationNames { 031 public static final FqName KOTLIN_CLASS = KotlinClass.CLASS_NAME.getFqNameForClassNameWithoutDollars(); 032 public static final FqName KOTLIN_PACKAGE = new FqName("kotlin.jvm.internal.KotlinPackage"); 033 public static final FqName KOTLIN_FILE_FACADE = new FqName("kotlin.jvm.internal.KotlinFileFacade"); 034 public static final FqName KOTLIN_MULTIFILE_CLASS = new FqName("kotlin.jvm.internal.KotlinMultifileClass"); 035 public static final FqName KOTLIN_MULTIFILE_CLASS_PART = new FqName("kotlin.jvm.internal.KotlinMultifileClassPart"); 036 public static final FqName KOTLIN_CALLABLE = new FqName("kotlin.jvm.internal.KotlinCallable"); 037 038 public static final FqName JAVA_LANG_DEPRECATED = new FqName("java.lang.Deprecated"); 039 040 public static final FqName KOTLIN_DELEGATED_METHOD = new FqName("kotlin.jvm.internal.KotlinDelegatedMethod"); 041 public static final String IMPLEMENTATION_CLASS_NAME_FIELD_NAME = "implementationClassName"; 042 043 public static final FqName KOTLIN_SIGNATURE = new FqName("kotlin.jvm.KotlinSignature"); 044 public static final FqName OLD_KOTLIN_SIGNATURE = new FqName("jet.runtime.typeinfo.KotlinSignature"); 045 046 public static final String VERSION_FIELD_NAME = "version"; 047 public static final String KIND_FIELD_NAME = "kind"; 048 public static final String FILE_PART_CLASS_NAMES_FIELD_NAME = "filePartClassNames"; 049 public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName"; 050 public static final String DATA_FIELD_NAME = "data"; 051 public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); 052 public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets"); 053 054 public static final FqName TARGET_ANNOTATION = new FqName("java.lang.annotation.Target"); 055 public static final FqName RETENTION_ANNOTATION = new FqName("java.lang.annotation.Retention"); 056 public static final FqName DOCUMENTED_ANNOTATION = new FqName("java.lang.annotation.Documented"); 057 058 public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = new FqName("org.jetbrains.annotations.NotNull"); 059 public static final FqName JETBRAINS_NULLABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Nullable"); 060 public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); 061 public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); 062 063 public static final FqName PURELY_IMPLEMENTS_ANNOTATION = new FqName("kotlin.jvm.PurelyImplements"); 064 065 // Just for internal use: there is no such real classes in bytecode 066 public static final FqName ENHANCED_NULLABILITY_ANNOTATION = new FqName("kotlin.jvm.internal.EnhancedNullability"); 067 public static final FqName ENHANCED_MUTABILITY_ANNOTATION = new FqName("kotlin.jvm.internal.EnhancedMutability"); 068 069 public static class KotlinClass { 070 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinClass"); 071 public static final ClassId KIND_CLASS_ID = 072 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 073 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 074 075 /** 076 * This enum duplicates {@link kotlin.jvm.internal.KotlinClass.Kind}. Both places should be updated simultaneously. 077 */ 078 public enum Kind { 079 CLASS, 080 LOCAL_CLASS, 081 ANONYMOUS_OBJECT, 082 ; 083 } 084 } 085 086 public static class KotlinSyntheticClass { 087 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinSyntheticClass"); 088 public static final ClassId KIND_CLASS_ID = 089 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 090 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 091 092 /** 093 * This enum duplicates {@link kotlin.jvm.internal.KotlinSyntheticClass.Kind}. Both places should be updated simultaneously. 094 */ 095 public enum Kind { 096 PACKAGE_PART, 097 TRAIT_IMPL, 098 LOCAL_TRAIT_IMPL, 099 SAM_WRAPPER, 100 SAM_LAMBDA, 101 CALLABLE_REFERENCE_WRAPPER, 102 LOCAL_FUNCTION, 103 ANONYMOUS_FUNCTION, 104 WHEN_ON_ENUM_MAPPINGS, 105 ; 106 } 107 } 108 109 @Deprecated 110 public static final FqName OLD_JET_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetClass"); 111 @Deprecated 112 public static final FqName OLD_JET_PACKAGE_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetPackageClass"); 113 @Deprecated 114 public static final FqName OLD_KOTLIN_CLASS = new FqName("jet.KotlinClass"); 115 @Deprecated 116 public static final FqName OLD_KOTLIN_PACKAGE = new FqName("jet.KotlinPackage"); 117 @Deprecated 118 public static final FqName OLD_KOTLIN_PACKAGE_FRAGMENT = new FqName("jet.KotlinPackageFragment"); 119 @Deprecated 120 public static final FqName OLD_KOTLIN_TRAIT_IMPL = new FqName("jet.KotlinTraitImpl"); 121 122 public static final String OLD_ABI_VERSION_FIELD_NAME = "abiVersion"; 123 124 // When these annotations appear on a declaration, they are copied to the _type_ of the declaration, becoming type annotations 125 // See also DescriptorRendererOptions#excludedTypeAnnotationClasses 126 public static final Set<FqName> ANNOTATIONS_COPIED_TO_TYPES = KotlinPackage.setOf( 127 JETBRAINS_READONLY_ANNOTATION, 128 JETBRAINS_MUTABLE_ANNOTATION, 129 JETBRAINS_NOT_NULL_ANNOTATION, 130 JETBRAINS_NULLABLE_ANNOTATION 131 ); 132 133 private static final Set<JvmClassName> SPECIAL_ANNOTATIONS = new HashSet<JvmClassName>(); 134 private static final Set<JvmClassName> NULLABILITY_ANNOTATIONS = new HashSet<JvmClassName>(); 135 private static final Set<JvmClassName> SPECIAL_META_ANNOTATIONS = new HashSet<JvmClassName>(); 136 static { 137 for (FqName fqName : Arrays.asList(KOTLIN_CLASS, KOTLIN_PACKAGE, KOTLIN_SIGNATURE)) { 138 SPECIAL_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 139 } 140 SPECIAL_ANNOTATIONS.add(KotlinSyntheticClass.CLASS_NAME); 141 142 for (FqName fqName : Arrays.asList(JETBRAINS_NOT_NULL_ANNOTATION, JETBRAINS_NULLABLE_ANNOTATION)) { 143 NULLABILITY_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 144 } 145 for (FqName fqName : Arrays.asList(TARGET_ANNOTATION, RETENTION_ANNOTATION, DOCUMENTED_ANNOTATION)) { 146 SPECIAL_META_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 147 } 148 } 149 150 public static boolean isSpecialAnnotation(@NotNull ClassId classId, boolean javaSpecificAnnotationsAreSpecial) { 151 JvmClassName className = JvmClassName.byClassId(classId); 152 return (javaSpecificAnnotationsAreSpecial 153 && (NULLABILITY_ANNOTATIONS.contains(className) || SPECIAL_META_ANNOTATIONS.contains(className)) 154 ) || SPECIAL_ANNOTATIONS.contains(className) || className.getInternalName().startsWith("jet/runtime/typeinfo/"); 155 } 156 157 private JvmAnnotationNames() { 158 } 159 }