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 org.jetbrains.annotations.NotNull; 020 import org.jetbrains.kotlin.name.ClassId; 021 import org.jetbrains.kotlin.name.FqName; 022 import org.jetbrains.kotlin.name.Name; 023 import org.jetbrains.kotlin.resolve.jvm.JvmClassName; 024 025 import java.util.Arrays; 026 import java.util.HashSet; 027 import java.util.Set; 028 029 public final class JvmAnnotationNames { 030 public static final FqName KOTLIN_CLASS = KotlinClass.CLASS_NAME.getFqNameForClassNameWithoutDollars(); 031 public static final FqName KOTLIN_PACKAGE = new FqName("kotlin.jvm.internal.KotlinPackage"); 032 033 public static final FqName KOTLIN_SIGNATURE = new FqName("kotlin.jvm.KotlinSignature"); 034 public static final FqName OLD_KOTLIN_SIGNATURE = new FqName("jet.runtime.typeinfo.KotlinSignature"); 035 036 public static final String ABI_VERSION_FIELD_NAME = "abiVersion"; 037 public static final String KIND_FIELD_NAME = "kind"; 038 public static final String DATA_FIELD_NAME = "data"; 039 public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); 040 041 public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = new FqName("org.jetbrains.annotations.NotNull"); 042 public static final FqName JETBRAINS_NULLABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Nullable"); 043 public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); 044 public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); 045 046 public static class KotlinClass { 047 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinClass"); 048 public static final ClassId KIND_CLASS_ID = 049 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 050 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 051 052 /** 053 * This enum duplicates {@link kotlin.jvm.internal.KotlinClass.Kind}. Both places should be updated simultaneously. 054 */ 055 public enum Kind { 056 CLASS, 057 LOCAL_CLASS, 058 ANONYMOUS_OBJECT, 059 ; 060 } 061 } 062 063 public static class KotlinSyntheticClass { 064 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinSyntheticClass"); 065 public static final ClassId KIND_CLASS_ID = 066 ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); 067 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 068 069 /** 070 * This enum duplicates {@link kotlin.jvm.internal.KotlinSyntheticClass.Kind}. Both places should be updated simultaneously. 071 */ 072 public enum Kind { 073 PACKAGE_PART, 074 TRAIT_IMPL, 075 LOCAL_TRAIT_IMPL, 076 SAM_WRAPPER, 077 SAM_LAMBDA, 078 CALLABLE_REFERENCE_WRAPPER, 079 LOCAL_FUNCTION, 080 ANONYMOUS_FUNCTION, 081 WHEN_ON_ENUM_MAPPINGS, 082 ; 083 } 084 } 085 086 @Deprecated 087 public static final FqName OLD_JET_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetClass"); 088 @Deprecated 089 public static final FqName OLD_JET_PACKAGE_CLASS_ANNOTATION = new FqName("jet.runtime.typeinfo.JetPackageClass"); 090 @Deprecated 091 public static final FqName OLD_JET_VALUE_PARAMETER_ANNOTATION = new FqName("jet.runtime.typeinfo.JetValueParameter"); 092 @Deprecated 093 public static final FqName OLD_KOTLIN_CLASS = new FqName("jet.KotlinClass"); 094 @Deprecated 095 public static final FqName OLD_KOTLIN_PACKAGE = new FqName("jet.KotlinPackage"); 096 @Deprecated 097 public static final FqName OLD_KOTLIN_PACKAGE_FRAGMENT = new FqName("jet.KotlinPackageFragment"); 098 @Deprecated 099 public static final FqName OLD_KOTLIN_TRAIT_IMPL = new FqName("jet.KotlinTraitImpl"); 100 101 private static final Set<JvmClassName> SPECIAL_ANNOTATIONS = new HashSet<JvmClassName>(); 102 private static final Set<JvmClassName> NULLABILITY_ANNOTATIONS = new HashSet<JvmClassName>(); 103 static { 104 for (FqName fqName : Arrays.asList(KOTLIN_CLASS, KOTLIN_PACKAGE, KOTLIN_SIGNATURE)) { 105 SPECIAL_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 106 } 107 SPECIAL_ANNOTATIONS.add(KotlinSyntheticClass.CLASS_NAME); 108 109 for (FqName fqName : Arrays.asList(JETBRAINS_NOT_NULL_ANNOTATION, JETBRAINS_NULLABLE_ANNOTATION)) { 110 NULLABILITY_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); 111 } 112 } 113 114 public static boolean isSpecialAnnotation(@NotNull ClassId classId, boolean javaSpecificAnnotationsAreSpecial) { 115 JvmClassName className = JvmClassName.byClassId(classId); 116 return (javaSpecificAnnotationsAreSpecial && NULLABILITY_ANNOTATIONS.contains(className)) 117 || SPECIAL_ANNOTATIONS.contains(className) 118 || className.getInternalName().startsWith("jet/runtime/typeinfo/"); 119 } 120 121 private JvmAnnotationNames() { 122 } 123 }