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.annotations.Nullable; 021 import org.jetbrains.kotlin.name.ClassId; 022 import org.jetbrains.kotlin.name.FqName; 023 import org.jetbrains.kotlin.name.FqNameUnsafe; 024 import org.jetbrains.kotlin.name.Name; 025 import org.jetbrains.kotlin.resolve.jvm.JvmClassName; 026 027 import java.util.Arrays; 028 import java.util.HashSet; 029 import java.util.Set; 030 031 public final class JvmAnnotationNames { 032 public static final FqName KOTLIN_CLASS = new FqName("kotlin.jvm.internal.KotlinClass"); 033 public static final FqName KOTLIN_PACKAGE = new FqName("kotlin.jvm.internal.KotlinPackage"); 034 035 public static final FqName KOTLIN_SIGNATURE = new FqName("kotlin.jvm.KotlinSignature"); 036 public static final FqName OLD_KOTLIN_SIGNATURE = new FqName("jet.runtime.typeinfo.KotlinSignature"); 037 038 public static final String ABI_VERSION_FIELD_NAME = "abiVersion"; 039 public static final String DATA_FIELD_NAME = "data"; 040 public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); 041 042 public static final FqName JETBRAINS_NOT_NULL_ANNOTATION = new FqName("org.jetbrains.annotations.NotNull"); 043 public static final FqName JETBRAINS_NULLABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Nullable"); 044 public static final FqName JETBRAINS_MUTABLE_ANNOTATION = new FqName("org.jetbrains.annotations.Mutable"); 045 public static final FqName JETBRAINS_READONLY_ANNOTATION = new FqName("org.jetbrains.annotations.ReadOnly"); 046 047 public static class KotlinSyntheticClass { 048 public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinSyntheticClass"); 049 public static final ClassId KIND_CLASS_ID = 050 new ClassId(new FqName("kotlin.jvm.internal"), new FqNameUnsafe("KotlinSyntheticClass.Kind")); 051 public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); 052 053 public static final Name KIND_FIELD_NAME = Name.identifier("kind"); 054 055 /** 056 * This enum duplicates {@link kotlin.jvm.internal.KotlinSyntheticClass.Kind}, because this code can't depend on "runtime.jvm". 057 * Both places should be updated simultaneously 058 */ 059 public enum Kind { 060 PACKAGE_PART, 061 TRAIT_IMPL, 062 SAM_WRAPPER, 063 SAM_LAMBDA, 064 CALLABLE_REFERENCE_WRAPPER, 065 LOCAL_FUNCTION, 066 ANONYMOUS_FUNCTION, 067 LOCAL_CLASS, 068 ANONYMOUS_OBJECT, 069 ; 070 071 @Nullable 072 public static Kind valueOfOrNull(@NotNull String name) { 073 try { 074 return valueOf(name); 075 } 076 catch (IllegalArgumentException e) { 077 return null; 078 } 079 } 080 } 081 082 private KotlinSyntheticClass() { 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 }