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    }