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 }