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    }