diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFileClassesProvider.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFileClassesProvider.kt index 5bf5eec8514..fcdf493e0f0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFileClassesProvider.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFileClassesProvider.kt @@ -27,9 +27,6 @@ import java.util.* public class CodegenFileClassesProvider() : JvmFileClassesProvider { private val fileParts = hashMapOf() - override fun getFileClassFqName(file: JetFile): FqName = - getFileClassInfo(file).fileClassFqName - - public fun getFileClassInfo(file: JetFile): JvmFileClassInfo = + override public fun getFileClassInfo(file: JetFile): JvmFileClassInfo = fileParts.getOrPut(file) { JvmFileClassUtil.getFileClassInfoNoResolve(file) } } \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 0480a27a6b3..33d323753b9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -148,9 +148,8 @@ public class FunctionCodegen { int flags = getMethodAsmFlags(functionDescriptor, contextKind); boolean isNative = NativeDeclarationsPackage.hasNativeAnnotation(functionDescriptor); - //TODO: generate native method only in new mini facades (now it equals to package part) - if (isNative && owner instanceof PackageFacadeContext) { - // Native methods are only defined in package facades and do not need package part implementations + if (isNative && owner instanceof DelegatingFacadeContext) { + // Native methods are only defined in facades and do not need package part implementations return; } MethodVisitor mv = v.newMethod(origin, @@ -160,7 +159,7 @@ public class FunctionCodegen { jvmSignature.getGenericsSignature(), getThrownExceptions(functionDescriptor, typeMapper)); - String implClassName = CodegenContextUtil.getImplClassNameByOwnerIfRequired(owner); + String implClassName = CodegenContextUtil.getImplementationClassShortName(owner); if (implClassName != null) { v.getSerializationBindings().put(IMPL_CLASS_NAME_FOR_CALLABLE, functionDescriptor, implClassName); } @@ -329,8 +328,8 @@ public class FunctionCodegen { JetTypeMapper typeMapper = parentCodegen.typeMapper; Label methodEnd; - if (context.getParentContext() instanceof PackageFacadeContext) { - generatePackageDelegateMethodBody(mv, signature.getAsmMethod(), (PackageFacadeContext) context.getParentContext()); + if (context.getParentContext() instanceof DelegatingFacadeContext) { + generateFacadeDelegateMethodBody(mv, signature.getAsmMethod(), (DelegatingFacadeContext) context.getParentContext()); methodEnd = new Label(); } else { @@ -402,10 +401,10 @@ public class FunctionCodegen { } } - private static void generatePackageDelegateMethodBody( + private static void generateFacadeDelegateMethodBody( @NotNull MethodVisitor mv, @NotNull Method asmMethod, - @NotNull PackageFacadeContext context + @NotNull DelegatingFacadeContext context ) { generateDelegateToMethodBody(true, mv, asmMethod, context.getDelegateToClassType().getInternalName()); } @@ -596,9 +595,9 @@ public class FunctionCodegen { AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(functionDescriptor, defaultMethod.getReturnType()); if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { - if (this.owner instanceof PackageFacadeContext) { + if (this.owner instanceof DelegatingFacadeContext) { mv.visitCode(); - generatePackageDelegateMethodBody(mv, defaultMethod, (PackageFacadeContext) this.owner); + generateFacadeDelegateMethodBody(mv, defaultMethod, (DelegatingFacadeContext) this.owner); endVisit(mv, "default method delegation", getSourceFromDescriptor(functionDescriptor)); } else { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 58780d947f4..ca868659281 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -289,9 +289,16 @@ public abstract class MemberCodegen { @NotNull Type multifileClassType, @NotNull Type filePartType ) { - return new MultifileClassContext(descriptor, this, multifileClassType, filePartType); + return new MultifileClassFacadeContext(descriptor, this, multifileClassType, filePartType); } @NotNull diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContextUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContextUtil.kt index 5b0f25e5aa4..7efcc145da2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContextUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContextUtil.kt @@ -21,21 +21,19 @@ import org.jetbrains.org.objectweb.asm.Type public object CodegenContextUtil { - public @JvmStatic fun getImplClassTypeByOwnerIfRequired(owner: CodegenContext<*>): Type? = + public @JvmStatic fun getImplementationOwnerClassType(owner: CodegenContext<*>): Type? = when (owner) { - is PackageFacadeContext -> + is DelegatingFacadeContext -> owner.delegateToClassType - is PackageContext -> - owner.packagePartType - is MultifileClassOrPartContext -> - owner.filePartType + is DelegatingToPartContext -> + owner.implementationOwnerClassType else -> null } - public @JvmStatic fun getImplClassNameByOwnerIfRequired(owner: CodegenContext<*>): String? = - getImplClassTypeByOwnerIfRequired(owner)?.let{ AsmUtil.shortNameByAsmType(it) } + public @JvmStatic fun getImplementationClassShortName(owner: CodegenContext<*>): String? = + getImplementationOwnerClassType(owner)?.let { AsmUtil.shortNameByAsmType(it) } public @JvmStatic fun isImplClassOwner(owner: CodegenContext<*>): Boolean = - !(owner is PackageFacadeContext || owner is MultifileClassContext) + owner !is DelegatingFacadeContext } \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingFacadeContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingFacadeContext.java new file mode 100644 index 00000000000..b8857e9a680 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingFacadeContext.java @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen.context; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.org.objectweb.asm.Type; + +public interface DelegatingFacadeContext { + @Nullable + public Type getDelegateToClassType(); +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingToPartContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingToPartContext.java new file mode 100644 index 00000000000..8648cf6e8c7 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/DelegatingToPartContext.java @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen.context; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.org.objectweb.asm.Type; + +public interface DelegatingToPartContext { + @Nullable + Type getImplementationOwnerClassType(); +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassOrPartContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContextBase.java similarity index 91% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassOrPartContext.java rename to compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContextBase.java index 4fb6d7237ae..08a67445443 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassOrPartContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContextBase.java @@ -20,11 +20,11 @@ import org.jetbrains.kotlin.codegen.OwnerKind; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; -public class MultifileClassOrPartContext extends FieldOwnerContext { +public class MultifileClassContextBase extends FieldOwnerContext { private final Type multifileClassType; private final Type filePartType; - public MultifileClassOrPartContext( + public MultifileClassContextBase( PackageFragmentDescriptor descriptor, CodegenContext parent, Type multifileClassType, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassFacadeContext.java similarity index 76% rename from compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContext.java rename to compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassFacadeContext.java index 40dc1de52ee..2bb6f57ca5e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassFacadeContext.java @@ -16,13 +16,12 @@ package org.jetbrains.kotlin.codegen.context; -import org.jetbrains.kotlin.codegen.OwnerKind; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; -public class MultifileClassContext extends MultifileClassOrPartContext { - public MultifileClassContext( +public class MultifileClassFacadeContext extends MultifileClassContextBase implements DelegatingFacadeContext { + public MultifileClassFacadeContext( PackageFragmentDescriptor descriptor, CodegenContext parent, Type multifileClassType, @@ -31,4 +30,9 @@ public class MultifileClassContext extends MultifileClassOrPartContext { super(descriptor, parent, multifileClassType, filePartType); } + @Nullable + @Override + public Type getDelegateToClassType() { + return getFilePartType(); + } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassPartContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassPartContext.java index 06d02910ac6..95a916113e7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassPartContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/MultifileClassPartContext.java @@ -16,12 +16,11 @@ package org.jetbrains.kotlin.codegen.context; -import org.jetbrains.kotlin.codegen.OwnerKind; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; -public class MultifileClassPartContext extends MultifileClassOrPartContext { +public class MultifileClassPartContext extends MultifileClassContextBase implements DelegatingToPartContext { public MultifileClassPartContext( PackageFragmentDescriptor descriptor, CodegenContext parent, @@ -31,4 +30,9 @@ public class MultifileClassPartContext extends MultifileClassOrPartContext { super(descriptor, parent, multifileClassType, filePartType); } + @Nullable + @Override + public Type getImplementationOwnerClassType() { + return getFilePartType(); + } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java index 90a63cf0742..894549cd86c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageContext.java @@ -17,14 +17,19 @@ package org.jetbrains.kotlin.codegen.context; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.codegen.OwnerKind; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; -public class PackageContext extends FieldOwnerContext { +public class PackageContext extends FieldOwnerContext implements DelegatingToPartContext { private final Type packagePartType; - public PackageContext(@NotNull PackageFragmentDescriptor contextDescriptor, @NotNull CodegenContext parent, Type packagePartType) { + public PackageContext( + @NotNull PackageFragmentDescriptor contextDescriptor, + @NotNull CodegenContext parent, + @Nullable Type packagePartType + ) { super(contextDescriptor, OwnerKind.PACKAGE, parent, null, null, null); this.packagePartType = packagePartType; } @@ -34,7 +39,14 @@ public class PackageContext extends FieldOwnerContext return "Package: " + getContextDescriptor().getName(); } + @Nullable public Type getPackagePartType() { return packagePartType; } + + @Nullable + @Override + public Type getImplementationOwnerClassType() { + return packagePartType; + } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java index 8260c8ae17a..1e72102d88f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/PackageFacadeContext.java @@ -17,20 +17,22 @@ package org.jetbrains.kotlin.codegen.context; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.org.objectweb.asm.Type; -public class PackageFacadeContext extends PackageContext { +public class PackageFacadeContext extends PackageContext implements DelegatingFacadeContext { public PackageFacadeContext( @NotNull PackageFragmentDescriptor contextDescriptor, @NotNull CodegenContext parent, - @NotNull Type delegateTo + @NotNull Type packagePartType ) { - super(contextDescriptor, parent, delegateTo); + super(contextDescriptor, parent, packagePartType); } - @NotNull + @Override + @Nullable public Type getDelegateToClassType() { return getPackagePartType(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index 24df2ae01b0..6969c9e35e8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -26,9 +26,7 @@ import org.jetbrains.annotations.TestOnly; import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.codegen.MemberCodegen; import org.jetbrains.kotlin.codegen.binding.CodegenBinding; -import org.jetbrains.kotlin.codegen.context.CodegenContext; -import org.jetbrains.kotlin.codegen.context.MethodContext; -import org.jetbrains.kotlin.codegen.context.PackageContext; +import org.jetbrains.kotlin.codegen.context.*; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; @@ -221,22 +219,22 @@ public class InlineCodegenUtil { if (currentDescriptor instanceof PackageFragmentDescriptor) { PsiFile file = getContainingFile(codegenContext); - Type packagePartType; + Type implementationOwnerType; if (file == null) { - //in case package fragment clinit - assert codegenContext instanceof PackageContext : "Expected package context but " + codegenContext; - packagePartType = ((PackageContext) codegenContext).getPackagePartType(); + implementationOwnerType = CodegenContextUtil.getImplementationOwnerClassType(codegenContext); } else { - packagePartType = fileClassesManager.getFileClassType((JetFile) file); + implementationOwnerType = fileClassesManager.getFileClassType((JetFile) file); } - if (packagePartType == null) { + if (implementationOwnerType == null) { DeclarationDescriptor contextDescriptor = codegenContext.getContextDescriptor(); //noinspection ConstantConditions - throw new RuntimeException("Couldn't find declaration for " + contextDescriptor.getContainingDeclaration().getName() + "." + contextDescriptor.getName() ); + throw new RuntimeException("Couldn't find declaration for " + + contextDescriptor.getContainingDeclaration().getName() + "." + contextDescriptor.getName() + + "; context: " + codegenContext); } - return packagePartType.getInternalName(); + return implementationOwnerType.getInternalName(); } else if (currentDescriptor instanceof ClassifierDescriptor) { Type type = typeMapper.mapType((ClassifierDescriptor) currentDescriptor); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 22600fc2660..f0b68b22d8f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -144,9 +144,7 @@ public class JetTypeMapper { if (container instanceof PackageFragmentDescriptor) { boolean effectiveInsideModule = isInsideModule && !NativeDeclarationsPackage.hasNativeAnnotation(descriptor); return Type.getObjectType(internalNameForPackage( - (PackageFragmentDescriptor) container, - (CallableMemberDescriptor) descriptor, - effectiveInsideModule + (CallableMemberDescriptor) descriptor )); } else if (container instanceof ClassDescriptor) { @@ -161,25 +159,25 @@ public class JetTypeMapper { } @NotNull - private String internalNameForPackage( - @NotNull PackageFragmentDescriptor packageFragment, - @NotNull CallableMemberDescriptor descriptor, - boolean insideModule - ) { - ///if (insideModule) { - JetFile file = DescriptorToSourceUtils.getContainingFile(descriptor); - if (file != null) { + private String internalNameForPackage(@NotNull CallableMemberDescriptor descriptor) { + JetFile file = DescriptorToSourceUtils.getContainingFile(descriptor); + if (file != null) { + Visibility visibility = descriptor.getVisibility(); + if (Visibilities.isPrivate(visibility)) { return fileClassesProvider.getFileClassInternalName(file); } - - CallableMemberDescriptor directMember = getDirectMember(descriptor); - - if (directMember instanceof DeserializedCallableMemberDescriptor) { - FqName packagePartFqName = PackagePartClassUtils.getPackagePartFqName((DeserializedCallableMemberDescriptor) directMember); - return internalNameByFqNameWithoutInnerClasses(packagePartFqName); + else { + return fileClassesProvider.getFacadeClassInternalName(file); } + } - //} + CallableMemberDescriptor directMember = getDirectMember(descriptor); + + if (directMember instanceof DeserializedCallableMemberDescriptor) { + // TODO private vs public + FqName packagePartFqName = PackagePartClassUtils.getPackagePartFqName((DeserializedCallableMemberDescriptor) directMember); + return internalNameByFqNameWithoutInnerClasses(packagePartFqName); + } throw new RuntimeException("Unreachable state"); //return PackageClassUtils.getPackageClassInternalName(packageFragment.getFqName()); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassesProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassesProvider.kt index 539d60ed58f..774d9969f46 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassesProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassesProvider.kt @@ -22,12 +22,29 @@ import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.org.objectweb.asm.Type public interface JvmFileClassesProvider { - public fun getFileClassFqName(file: JetFile): FqName + public fun getFileClassInfo(file: JetFile): JvmFileClassInfo + + public fun getFileClassFqName(file: JetFile): FqName = + getFileClassInfo(file).fileClassFqName public fun getFileClassInternalName(file: JetFile): String = - JvmClassName.byFqNameWithoutInnerClasses(getFileClassFqName(file)).internalName + getFileClassFqName(file).getInternalName() public fun getFileClassType(file: JetFile): Type = - Type.getObjectType(getFileClassInternalName(file)) + getFileClassFqName(file).getClassType() + + public fun getFacadeClassFqName(file: JetFile): FqName = + getFileClassInfo(file).facadeClassFqName + + public fun getFacadeClassInternalName(file: JetFile): String = + getFacadeClassFqName(file).getInternalName() + + public fun getFacadeClassType(file: JetFile): Type = + getFacadeClassFqName(file).getClassType() } +private fun FqName.getInternalName(): String = + JvmClassName.byFqNameWithoutInnerClasses(this).internalName + +private fun FqName.getClassType(): Type = + Type.getObjectType(getInternalName()) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/NoResolveFileClassesProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/NoResolveFileClassesProvider.kt index f44e11de32e..19e69d0f5bc 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/NoResolveFileClassesProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/NoResolveFileClassesProvider.kt @@ -21,6 +21,6 @@ import org.jetbrains.kotlin.psi.JetFile public object NoResolveFileClassesProvider : JvmFileClassesProvider { - override fun getFileClassFqName(file: JetFile): FqName = - JvmFileClassUtil.getFileClassInfo(file, JvmFileClassUtil.parseJvmNameOnFileNoResolve(file)).fileClassFqName + override fun getFileClassInfo(file: JetFile): JvmFileClassInfo = + JvmFileClassUtil.getFileClassInfo(file, JvmFileClassUtil.parseJvmNameOnFileNoResolve(file)) } \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/Baz.java b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/Baz.java similarity index 100% rename from compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/Baz.java rename to compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/Baz.java diff --git a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/bar.kt b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/bar.kt similarity index 71% rename from compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/bar.kt rename to compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/bar.kt index b95dd3fdd30..9ba3b952920 100644 --- a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/bar.kt +++ b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/bar.kt @@ -2,4 +2,4 @@ @file:JvmMultifileClass public fun bar(): String = barx() -private fun foox(): String = "O" \ No newline at end of file +public fun foox(): String = "O" \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/foo.kt b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/foo.kt similarity index 71% rename from compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/foo.kt rename to compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/foo.kt index 2245cb041d3..6c6939f4453 100644 --- a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/foo.kt +++ b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/foo.kt @@ -2,4 +2,4 @@ @file:JvmMultifileClass public fun foo(): String = foox() -private fun barx(): String = "K" \ No newline at end of file +public fun barx(): String = "K" \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/multifileClassWithInternal.kt b/compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/multifileClassWithInternal.kt similarity index 100% rename from compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/multifileClassWithInternal.kt rename to compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/multifileClassWithInternal.kt diff --git a/compiler/testData/codegen/boxWithStdlib/platformNames/multifileClassWithLocalClass.kt b/compiler/testData/codegen/boxWithStdlib/platformNames/multifileClassWithLocalClass.kt new file mode 100644 index 00000000000..71556525580 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/platformNames/multifileClassWithLocalClass.kt @@ -0,0 +1,11 @@ +@file:JvmName("TestPackage") +@file:JvmMultifileClass +package test + +fun foo(): String = bar() +fun bar(): String { + class Local(val x: String) + return Local("OK").x +} + +fun box(): String = foo() \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/otherFile.kt b/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/otherFile.kt new file mode 100644 index 00000000000..8626373c571 --- /dev/null +++ b/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/otherFile.kt @@ -0,0 +1,5 @@ +@file:[JvmName("Util") JvmMultifileClass] +package test + +internal fun internalInOtherFile() {} +public fun publicInOtherFile() {} diff --git a/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/thisFile.kt b/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/thisFile.kt new file mode 100644 index 00000000000..24216cb85e5 --- /dev/null +++ b/compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/thisFile.kt @@ -0,0 +1,23 @@ +@file:[JvmName("Util") JvmMultifileClass] +package test + +fun foo() { + privateInThisFile() + internalInThisFile() + publicInThisFile() + internalInOtherFile() + publicInOtherFile() +} + +private fun privateInThisFile() {} + +internal fun internalInThisFile() {} + +public fun publicInThisFile() {} + +// @test/1ThisFileKt.class: +// 1 INVOKESTATIC test/1ThisFileKt.privateInThisFile +// 1 INVOKESTATIC test/1ThisFileKt.internalInThisFile +// 1 INVOKESTATIC test/1ThisFileKt.publicInThisFile +// 1 INVOKESTATIC test/1OtherFileKt.internalInOtherFile +// 1 INVOKESTATIC test/1OtherFileKt.publicInOtherFile \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextMultifileTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextMultifileTestGenerated.java new file mode 100644 index 00000000000..9d0838b4687 --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextMultifileTestGenerated.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.JetTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/codegen/bytecodeTextMultifile") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class BytecodeTextMultifileTestGenerated extends AbstractBytecodeTextTest { + public void testAllFilesPresentInBytecodeTextMultifile() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeTextMultifile"), Pattern.compile("^([^\\.]+)$"), false); + } + + @TestMetadata("partMembersCall") + public void testPartMembersCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeTextMultifile/partMembersCall/"); + doTestMultiFile(fileName); + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index fe559e005dd..b36dc15c0f8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -141,9 +141,9 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava(fileName); } - @TestMetadata("multifileClassWithCrossPrivate") - public void testMultifileClassWithCrossPrivate() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossPrivate/"); + @TestMetadata("multifileClassWithCrossCall") + public void testMultifileClassWithCrossCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/fileClasses/multifileClassWithCrossCall/"); doTestWithJava(fileName); } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index e5f1a04583b..5f2f736e5be 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -2245,6 +2245,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("multifileClassWithLocalClass.kt") + public void testMultifileClassWithLocalClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/platformNames/multifileClassWithLocalClass.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("multifileClassWithLocalGeneric.kt") public void testMultifileClassWithLocalGeneric() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/platformNames/multifileClassWithLocalGeneric.kt");