public static String getInlineName( @NotNull CodegenContext codegenContext, @NotNull JetTypeMapper typeMapper, @NotNull JvmFileClassesProvider fileClassesManager) { return getInlineName( codegenContext, codegenContext.getContextDescriptor(), typeMapper, fileClassesManager); }
@Nullable public static PsiFile getContainingFile(CodegenContext codegenContext) { DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor(); PsiElement psiElement = DescriptorToSourceUtils.descriptorToDeclaration(contextDescriptor); if (psiElement != null) { return psiElement.getContainingFile(); } return null; }
private static String getInlineName( @NotNull CodegenContext codegenContext, @NotNull DeclarationDescriptor currentDescriptor, @NotNull JetTypeMapper typeMapper, @NotNull JvmFileClassesProvider fileClassesProvider) { if (currentDescriptor instanceof PackageFragmentDescriptor) { PsiFile file = getContainingFile(codegenContext); Type implementationOwnerType; if (file == null) { implementationOwnerType = CodegenContextUtil.getImplementationOwnerClassType(codegenContext); } else { implementationOwnerType = FileClassesPackage.getFileClassType(fileClassesProvider, (JetFile) file); } if (implementationOwnerType == null) { DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor(); //noinspection ConstantConditions throw new RuntimeException( "Couldn't find declaration for " + contextDescriptor.getContainingDeclaration().getName() + "." + contextDescriptor.getName() + "; context: " + codegenContext); } return implementationOwnerType.getInternalName(); } else if (currentDescriptor instanceof ClassifierDescriptor) { Type type = typeMapper.mapType((ClassifierDescriptor) currentDescriptor); return type.getInternalName(); } else if (currentDescriptor instanceof FunctionDescriptor) { ClassDescriptor descriptor = typeMapper .getBindingContext() .get(CodegenBinding.CLASS_FOR_CALLABLE, (FunctionDescriptor) currentDescriptor); if (descriptor != null) { Type type = typeMapper.mapType(descriptor); return type.getInternalName(); } } // TODO: add suffix for special case String suffix = currentDescriptor.getName().isSpecial() ? "" : currentDescriptor.getName().asString(); //noinspection ConstantConditions return getInlineName( codegenContext, currentDescriptor.getContainingDeclaration(), typeMapper, fileClassesProvider) + "$" + suffix; }