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 KOTLIN_SIGNATURE = new FqName("kotlin.jvm.KotlinSignature"); 039 public static final FqName OLD_KOTLIN_SIGNATURE = new FqName("jet.runtime.typeinfo.KotlinSignature"); 040 041 public static final String VERSION_FIELD_NAME = "version"; 042 public static final String KIND_FIELD_NAME = "kind"; 043 public static final String FILE_PART_CLASS_NAMES_FIELD_NAME = "filePartClassNames"; 044 public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName"; 045 public static final String DATA_FIELD_NAME = "data"; 046 public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); 047 public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets"); 048 049 public static final FqName TARGET_ANNOTATION = new FqName("java.lang.annotation.Target"); 050 public static final FqName RETENTION_ANNOTATION = new FqName("java.lang.annotation.Retention"); 051 public static final FqName DOCUMENTED_ANNOTATION = new FqName("java.lang.annotation.Documented"); 052 053 public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = new FqName("org.jetbrains.annotations.NotNull"); 054 public static final FqName JETBRAINS_NULLABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Nullable"); 055 public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); 056 public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); 057 058 public static final FqName PURELY_IMPLEMENTS_ANNOTATION = new FqName("kotlin.jvm.PurelyImplements"); 059 060 // Just for internal use: there is no such real classes in bytecode 061 public static final FqName ENHANCED_NULLABILITY_ANNOTATION = new FqName("kotlin.jvm.internal.EnhancedNullability"); 062 public static final FqName ENHANCED_MUTABILITY_ANNOTATION = new FqName("kotlin.jvm.internal.EnhancedMutability"); 063 064 public static class KotlinClass { 065 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinClass"); 066 public static final ClassId KIND_CLASS_ID = 067 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 068 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 069 070 /** 071 * This enum duplicates {@link kotlin.jvm.internal.KotlinClass.Kind}. Both places should be updated simultaneously. 072 */ 073 public enum Kind { 074 CLASS, 075 LOCAL_CLASS, 076 ANONYMOUS_OBJECT, 077 ; 078 } 079 } 080 081 public static class KotlinSyntheticClass { 082 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinSyntheticClass"); 083 public static final ClassId KIND_CLASS_ID = 084 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 085 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 086 087 /** 088 * This enum duplicates {@link kotlin.jvm.internal.KotlinSyntheticClass.Kind}. Both places should be updated simultaneously. 089 */ 090 public enum Kind { 091 PACKAGE_PART, 092 TRAIT_IMPL, 093 LOCAL_TRAIT_IMPL, 094 SAM_WRAPPER, 095 SAM_LAMBDA, 096 CALLABLE_REFERENCE_WRAPPER, 097 LOCAL_FUNCTION, 098 ANONYMOUS_FUNCTION, 099 WHEN_ON_ENUM_MAPPINGS, 100 ; 101 } 102 } 103 104 @Deprecated 105 public static final FqName OLD_JET_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetClass"); 106 @Deprecated 107 public static final FqName OLD_JET_PACKAGE_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetPackageClass"); 108 @Deprecated 109 public static final FqName OLD_KOTLIN_CLASS = new FqName("jet.KotlinClass"); 110 @Deprecated 111 public static final FqName OLD_KOTLIN_PACKAGE = new FqName("jet.KotlinPackage"); 112 @Deprecated 113 public static final FqName OLD_KOTLIN_PACKAGE_FRAGMENT = new FqName("jet.KotlinPackageFragment"); 114 @Deprecated 115 public static final FqName OLD_KOTLIN_TRAIT_IMPL = new FqName("jet.KotlinTraitImpl"); 116 117 public static final String OLD_ABI_VERSION_FIELD_NAME = "abiVersion"; 118 119 // When these annotations appear on a declaration, they are copied to the _type_ of the declaration, becoming type annotations 120 // See also DescriptorRendererOptions#excludedTypeAnnotationClasses 121 public static final Set<FqName> ANNOTATIONS_COPIED_TO_TYPES = KotlinPackage.setOf( 122 JETBRAINS_READONLY_ANNOTATION, 123 JETBRAINS_MUTABLE_ANNOTATION, 124 JETBRAINS_NOT_NULL_ANNOTATION, 125 JETBRAINS_NULLABLE_ANNOTATION 126 ); 127 128 private static final Set<JvmClassName> SPECIAL_ANNOTATIONS = new HashSet<JvmClassName>(); 129 private static final Set<JvmClassName> NULLABILITY_ANNOTATIONS = new HashSet<JvmClassName>(); 130 private static final Set<JvmClassName> SPECIAL_META_ANNOTATIONS = new HashSet<JvmClassName>(); 131 static { 132 for (FqName fqName : Arrays.asList(KOTLIN_CLASS, KOTLIN_PACKAGE, KOTLIN_SIGNATURE)) { 133 SPECIAL_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 134 } 135 SPECIAL_ANNOTATIONS.add(KotlinSyntheticClass.CLASS_NAME); 136 137 for (FqName fqName : Arrays.asList(JETBRAINS_NOT_NULL_ANNOTATION, JETBRAINS_NULLABLE_ANNOTATION)) { 138 NULLABILITY_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 139 } 140 for (FqName fqName : Arrays.asList(TARGET_ANNOTATION, RETENTION_ANNOTATION, DOCUMENTED_ANNOTATION)) { 141 SPECIAL_META_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 142 } 143 } 144 145 public static boolean isSpecialAnnotation(@NotNull ClassId classId, boolean javaSpecificAnnotationsAreSpecial) { 146 JvmClassName className = JvmClassName.byClassId(classId); 147 return (javaSpecificAnnotationsAreSpecial 148 && (NULLABILITY_ANNOTATIONS.contains(className) || SPECIAL_META_ANNOTATIONS.contains(className)) 149 ) || SPECIAL_ANNOTATIONS.contains(className) || className.getInternalName().startsWith("jet/runtime/typeinfo/"); 150 } 151 152 private JvmAnnotationNames() { 153 } 154 }