diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index fe0db1edcdb..d12e5be7231 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -44,7 +44,8 @@ import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescrip import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; -import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPurePackageScope; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; @@ -126,7 +127,10 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull DeclarationDescriptor descriptor, boolean insideModule ) { - if (!(packageFragment instanceof JavaPackageFragmentDescriptor) || packageFragment.getMemberScope() instanceof DeserializedPackageMemberScope) { + JetScope packageScope = packageFragment.getMemberScope(); + if (!(packageFragment instanceof JavaPackageFragmentDescriptor) + || packageScope instanceof DeserializedPackageMemberScope + || packageScope instanceof JavaFullPackageScope) { JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor); if (insideModule && file != null) { return NamespaceCodegen.getNamespacePartInternalName(file); @@ -136,8 +140,8 @@ public class JetTypeMapper extends BindingTraceAware { } } - if (!(packageFragment.getMemberScope() instanceof JavaClassStaticMembersScope)) { - throw new IllegalStateException("Unexpected scope: " + packageFragment.getMemberScope().getClass()); + if (!(packageScope instanceof JavaClassStaticMembersScope)) { + throw new IllegalStateException("Unexpected scope: " + packageScope.getClass()); } JavaPackageFragmentProvider javaFragmentProvider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider(); @@ -153,7 +157,7 @@ public class JetTypeMapper extends BindingTraceAware { if (memberScope instanceof JavaClassStaticMembersScope) { r.append("$"); } - else if (memberScope instanceof JavaPackageScope) { + else if (memberScope instanceof JavaPurePackageScope || memberScope instanceof JavaFullPackageScope) { r.append("/"); } else { diff --git a/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage.txt b/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage.txt index abdd91c1dc8..0cb2d1f1758 100644 --- a/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage.txt +++ b/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage.txt @@ -1,5 +1,6 @@ package test +public /*synthesized*/ fun SamInterface(/*0*/ function: () -> jet.Unit): test.SamInterface public fun topLevelFunction(): jet.Unit public open class JavaClass : java.lang.Object { @@ -11,6 +12,10 @@ public final class KotlinClass { public constructor KotlinClass() } +public trait SamInterface : java.lang.Object { + public abstract fun instanceMethod(): jet.Unit +} + package JavaClass { public open fun staticMethod(): jet.Unit } diff --git a/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage/SamInterface.java b/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage/SamInterface.java new file mode 100644 index 00000000000..fba1141a4ee --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaAndKotlin/MixedPackage/SamInterface.java @@ -0,0 +1,5 @@ +package test; + +public interface SamInterface { + void instanceMethod(); +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractLoadCompiledKotlinTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractLoadCompiledKotlinTest.java index 6b56240577e..e6f73f2db2a 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractLoadCompiledKotlinTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractLoadCompiledKotlinTest.java @@ -21,9 +21,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; -import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.test.TestCaseWithTmpdir; import org.jetbrains.jet.test.util.RecursiveDescriptorComparator; @@ -78,11 +78,11 @@ public abstract class AbstractLoadCompiledKotlinTest extends TestCaseWithTmpdir } } if (hasOwnMembers) { - assert scope instanceof DeserializedPackageMemberScope : "If namespace has members, members should be inside deserialized scope."; + assert scope instanceof JavaFullPackageScope : "If namespace has members, members should be inside deserialized scope."; } else { //NOTE: should probably change - assert !(scope instanceof DeserializedPackageMemberScope) : "We don't use deserialized scopes for namespaces without members."; + assert !(scope instanceof JavaFullPackageScope) : "We don't use deserialized scopes for namespaces without members."; } } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java index b96a28b25fd..be10fa5e23f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java @@ -26,8 +26,8 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageFragmentScope; import org.jetbrains.jet.lang.resolve.name.FqName; -import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.Collections; @@ -35,12 +35,12 @@ import java.util.Collections; public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl implements PackageFragmentDescriptor { private final JavaPackageFragmentProvider provider; private final FqName fqName; - private final JetScope memberScope; + private final JavaPackageFragmentScope memberScope; private JavaPackageFragmentDescriptor( @NotNull JavaPackageFragmentProvider provider, @NotNull FqName fqName, - @NotNull NullableFunction scopeFactory + @NotNull NullableFunction scopeFactory ) { super(Collections.emptyList(), fqName.shortNameOrSpecial()); this.provider = provider; @@ -52,7 +52,7 @@ public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl imp public static JavaPackageFragmentDescriptor create( @NotNull JavaPackageFragmentProvider provider, @NotNull FqName fqName, - @NotNull NullableFunction scopeFactory + @NotNull NullableFunction scopeFactory ) { JavaPackageFragmentDescriptor descriptor = new JavaPackageFragmentDescriptor(provider, fqName, scopeFactory); return descriptor.memberScope == null ? null : descriptor; @@ -77,7 +77,7 @@ public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl imp @NotNull @Override - public JetScope getMemberScope() { + public JavaPackageFragmentScope getMemberScope() { return memberScope; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java index 24a60b1d29e..83a0bf09dd9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java @@ -47,10 +47,8 @@ public final class DescriptorResolverUtils { public static boolean isCompiledKotlinPackageClass(@NotNull JavaClass javaClass) { if (javaClass.getOriginKind() == JavaClass.OriginKind.COMPILED) { - FqName fqName = javaClass.getFqName(); - if (fqName != null && PackageClassUtils.isPackageClassFqName(fqName)) { - return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE) != null; - } + return javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE) != null + || javaClass.findAnnotation(JvmAnnotationNames.KOTLIN_PACKAGE_FRAGMENT) != null; } return false; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java index 2374b14f86b..8cad077d73d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java @@ -28,7 +28,9 @@ import org.jetbrains.jet.lang.resolve.java.JavaClassFinder; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; -import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageFragmentScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPurePackageScope; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; @@ -93,20 +95,12 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide @NotNull @Override public Collection getSubPackagesOf(@NotNull FqName fqName) { - PackageFragmentDescriptor packageFragment = getOrCreatePackage(fqName); + JavaPackageFragmentDescriptor packageFragment = getOrCreatePackage(fqName); if (packageFragment == null) { return Collections.emptyList(); } - JetScope scope = packageFragment.getMemberScope(); - // TODO 2 replace instanceof with interface - if (scope instanceof JavaPackageScope) { - return ((JavaPackageScope) scope).getSubPackages(); - } - if (scope instanceof JavaClassStaticMembersScope) { - return ((JavaClassStaticMembersScope) scope).getSubPackages(); - } - return Collections.emptyList(); + return packageFragment.getMemberScope().getSubPackages(); } @Nullable @@ -115,10 +109,11 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide return packageFragments.get(fqName); } - JavaPackageFragmentDescriptor packageFragment = JavaPackageFragmentDescriptor.create(this, fqName, new NullableFunction() { + JavaPackageFragmentDescriptor packageFragment = JavaPackageFragmentDescriptor.create( + this, fqName, new NullableFunction() { @Override @Nullable - public JetScope fun(JavaPackageFragmentDescriptor packageFragment) { + public JavaPackageFragmentScope fun(JavaPackageFragmentDescriptor packageFragment) { return createPackageScope(fqName, packageFragment); } }); @@ -128,7 +123,7 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide } @Nullable - private JetScope createPackageScope( + private JavaPackageFragmentScope createPackageScope( @NotNull FqName fqName, @NotNull PackageFragmentDescriptor packageFragment ) { @@ -142,11 +137,14 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide if (kotlinClass != null) { JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(packageFragment, kotlinClass); if (kotlinPackageScope != null) { - return kotlinPackageScope; + return new JavaFullPackageScope(packageFragment, kotlinPackageScope, + new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, + /* includeCompiledKotlinClasses = */ false)); } } - return new JavaPackageScope(packageFragment, javaPackage, fqName, memberResolver); + return new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, + /* includeCompiledKotlinClasses = */ true); } JavaClass javaClass = javaClassFinder.findClass(fqName); @@ -165,7 +163,7 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide Collection classes = DescriptorResolverUtils.getClassesInPackage(javaPackage); List result = new ArrayList(classes.size()); for (JavaClass javaClass : classes) { - if (DescriptorResolverUtils.isCompiledKotlinClass(javaClass)) { + if (!DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) { result.add(javaClass.getName()); } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java index f7c6acec066..37d38674048 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java @@ -29,7 +29,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -public final class JavaClassStaticMembersScope extends JavaClassMembersScope { +public final class JavaClassStaticMembersScope extends JavaClassMembersScope implements JavaPackageFragmentScope { @NotNull private final JavaClass javaClass; @@ -48,6 +48,7 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope { return Collections.emptyList(); } + @Override @NotNull public Collection getSubPackages() { List result = Lists.newArrayList(); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaFullPackageScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaFullPackageScope.java new file mode 100644 index 00000000000..062a0e421f1 --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaFullPackageScope.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2013 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.jet.lang.resolve.java.scope; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.scopes.ChainedScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; + +import java.util.Collection; + +public class JavaFullPackageScope extends ChainedScope implements JavaPackageFragmentScope { + private final JavaPurePackageScope purePackageScope; + + public JavaFullPackageScope( + @NotNull PackageFragmentDescriptor packageFragment, + @NotNull JetScope kotlinPackageScope, + @NotNull JavaPurePackageScope purePackageScope + ) { + super(packageFragment, kotlinPackageScope, purePackageScope); + this.purePackageScope = purePackageScope; + } + + @Override + public Collection getSubPackages() { + return purePackageScope.getSubPackages(); + } +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageFragmentScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageFragmentScope.java new file mode 100644 index 00000000000..244d1ef3dc6 --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageFragmentScope.java @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2013 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.jet.lang.resolve.java.scope; + +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; + +import java.util.Collection; + +public interface JavaPackageFragmentScope extends JetScope { + Collection getSubPackages(); +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java similarity index 89% rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java index 5b2f4c20543..9827797e467 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java @@ -31,21 +31,24 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES; -public final class JavaPackageScope extends JavaBaseScope { +public final class JavaPurePackageScope extends JavaBaseScope implements JavaPackageFragmentScope { @NotNull private final JavaPackage javaPackage; @NotNull private final FqName packageFQN; + private final boolean includeCompiledKotlinClasses; - public JavaPackageScope( + public JavaPurePackageScope( @NotNull PackageFragmentDescriptor descriptor, @NotNull JavaPackage javaPackage, @NotNull FqName packageFQN, - @NotNull JavaMemberResolver memberResolver + @NotNull JavaMemberResolver memberResolver, + boolean includeCompiledKotlinClasses ) { super(descriptor, memberResolver, MembersProvider.forPackage(javaPackage)); this.javaPackage = javaPackage; this.packageFQN = packageFQN; + this.includeCompiledKotlinClasses = includeCompiledKotlinClasses; } @Override @@ -67,6 +70,7 @@ public final class JavaPackageScope extends JavaBaseScope { for (JavaClass javaClass : DescriptorResolverUtils.getClassesInPackage(javaPackage)) { if (DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) continue; + if (!includeCompiledKotlinClasses && DescriptorResolverUtils.isCompiledKotlinClass(javaClass)) continue; if (javaClass.getOriginKind() == JavaClass.OriginKind.KOTLIN_LIGHT_CLASS) continue; @@ -106,6 +110,7 @@ public final class JavaPackageScope extends JavaBaseScope { return Collections.emptyList(); } + @Override @NotNull public Collection getSubPackages() { List result = Lists.newArrayList();