extract code for generating multifile namespace class names

This commit is contained in:
Alexander Udalov
2012-08-20 15:32:52 +04:00
parent 69b403783b
commit 99ab76c8fd
2 changed files with 18 additions and 5 deletions
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.utils.Progress;
import java.io.File;
import java.util.Collection;
import static org.jetbrains.asm4.Opcodes.*;
@@ -151,9 +152,8 @@ public class NamespaceCodegen {
if (k > 0) {
PsiFile containingFile = file.getContainingFile();
String fname = containingFile.getName();
fname = fname.substring(0, fname.lastIndexOf('.'));
String className = name.child(Name.identifier("namespace$src$" + fname)).getFqName().replace('.', '/');
String namespaceInternalName = name.child(Name.identifier(JvmAbi.PACKAGE_CLASS)).getFqName().replace('.', '/');
String className = getMultiFileNamespaceInternalName(namespaceInternalName, containingFile);
ClassBuilder builder = state.forNamespacepart(className);
builder.defineClass(containingFile, V1_6,
@@ -282,4 +282,18 @@ public class NamespaceCodegen {
return JvmClassName.byInternalName(fqName.getFqName().replace('.', '/') + "/" + JvmAbi.PACKAGE_CLASS);
}
@NotNull
public static String getMultiFileNamespaceInternalName(String namespaceInternalName, PsiFile file) {
String name = file.getName();
int substringFrom = name.lastIndexOf(File.separator) + 1;
int substringTo = name.lastIndexOf('.');
if (substringTo == -1) {
substringTo = name.length();
}
return namespaceInternalName + "$src$" + name.substring(substringFrom, substringTo);
}
}
@@ -159,8 +159,7 @@ public class JetPositionManager implements PositionManager {
boolean multiFileNamespace = typeMapper.getClosureAnnotator().isMultiFileNamespace(fqName);
String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName();
if (multiFileNamespace) {
String name = namespace.getName();
result.set(namespaceInternalName + "$src$" + name.substring(0, name.lastIndexOf('.')));
result.set(NamespaceCodegen.getMultiFileNamespaceInternalName(namespaceInternalName, namespace));
}
else {
result.set(namespaceInternalName);