001    package org.jetbrains.jet.lang.types.lang;
002    
003    import org.jetbrains.annotations.NotNull;
004    import org.jetbrains.jet.descriptors.serialization.ClassId;
005    import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
006    import org.jetbrains.jet.lang.resolve.DescriptorUtils;
007    import org.jetbrains.jet.lang.resolve.name.FqName;
008    import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
009    import org.jetbrains.jet.lang.resolve.name.Name;
010    
011    import java.util.ArrayList;
012    import java.util.List;
013    
014    public class BuiltInsSerializationUtil {
015        private static final String CLASS_METADATA_FILE_EXTENSION = "kotlin_class";
016        private static final String PACKAGE_FILE_NAME = ".kotlin_package";
017        private static final String NAME_TABLE_FILE_NAME = ".kotlin_name_table";
018        private static final String CLASS_NAMES_FILE_NAME = ".kotlin_class_names";
019        private static final String CLASS_OBJECT_NAME = "object";
020    
021        private BuiltInsSerializationUtil() {
022        }
023    
024        @NotNull
025        public static String relativeClassNameToFilePath(@NotNull FqNameUnsafe className) {
026            List<String> correctedSegments = new ArrayList<String>();
027            for (Name segment : className.pathSegments()) {
028                if (segment.asString().startsWith("<class-object-for")) {
029                    correctedSegments.add(CLASS_OBJECT_NAME);
030                }
031                else {
032                    assert !segment.isSpecial();
033                    correctedSegments.add(segment.asString());
034                }
035            }
036            return FqName.fromSegments(correctedSegments).asString();
037        }
038    
039        @NotNull
040        public static String getClassMetadataPath(@NotNull ClassId classId) {
041            return packageFqNameToPath(classId.getPackageFqName().toUnsafe())
042                   + "/" + relativeClassNameToFilePath(classId.getRelativeClassName())
043                   + "." + CLASS_METADATA_FILE_EXTENSION;
044        }
045    
046        @NotNull
047        public static String getPackageFilePath(@NotNull NamespaceDescriptor packageDescriptor) {
048            FqNameUnsafe fqName = DescriptorUtils.getFQName(packageDescriptor);
049            return packageFqNameToPath(fqName) + "/" + PACKAGE_FILE_NAME;
050        }
051    
052        @NotNull
053        public static String getNameTableFilePath(@NotNull NamespaceDescriptor packageDescriptor) {
054            FqNameUnsafe fqName = DescriptorUtils.getFQName(packageDescriptor);
055            return packageFqNameToPath(fqName) + "/" + NAME_TABLE_FILE_NAME;
056        }
057    
058        @NotNull
059        public static String getClassNamesFilePath(@NotNull NamespaceDescriptor packageDescriptor) {
060            FqNameUnsafe fqName = DescriptorUtils.getFQName(packageDescriptor);
061            return packageFqNameToPath(fqName) + "/" + CLASS_NAMES_FILE_NAME;
062        }
063    
064        private static String packageFqNameToPath(FqNameUnsafe fqName) {
065            return fqName.asString().replace('.', '/');
066        }
067    }