Extract interface JavaPackageFragmentDescriptor

This commit is contained in:
Andrey Breslav
2013-12-23 18:53:35 +04:00
parent 61d346e93d
commit ed3932eca8
8 changed files with 119 additions and 99 deletions
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; 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.resolver.JavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope;
@@ -144,7 +145,7 @@ public class JetTypeMapper extends BindingTraceAware {
throw new IllegalStateException("Unexpected scope: " + packageScope.getClass()); throw new IllegalStateException("Unexpected scope: " + packageScope.getClass());
} }
JavaPackageFragmentProvider javaFragmentProvider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider(); JavaPackageFragmentProvider javaFragmentProvider = ((JavaPackageFragmentDescriptorImpl) packageFragment).getProvider();
StringBuilder r = new StringBuilder(); StringBuilder r = new StringBuilder();
for (FqName pathItem : packageFragment.getFqName().parent().path()) { for (FqName pathItem : packageFragment.getFqName().parent().path()) {
@@ -19,7 +19,7 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
public class JavaVisibilities { public class JavaVisibilities {
@@ -67,9 +67,9 @@ public class JavaVisibilities {
// protected static function or property // protected static function or property
else { else {
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration(); DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility"; assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptorImpl : "Only static declarations can have protected_static visibility";
whatClass = DescriptorResolverUtils whatClass = DescriptorResolverUtils
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptor) whatDeclarationDescriptor); .getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptorImpl) whatDeclarationDescriptor);
} }
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what; assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
@@ -16,79 +16,7 @@
package org.jetbrains.jet.lang.resolve.java.descriptor; package org.jetbrains.jet.lang.resolve.java.descriptor;
import com.intellij.util.NullableFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; 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.types.TypeSubstitutor;
import java.util.Collections; public interface JavaPackageFragmentDescriptor extends PackageFragmentDescriptor {
public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl implements PackageFragmentDescriptor {
private final JavaPackageFragmentProvider provider;
private final FqName fqName;
private final JavaPackageFragmentScope memberScope;
private JavaPackageFragmentDescriptor(
@NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope> scopeFactory
) {
super(Collections.<AnnotationDescriptor>emptyList(), fqName.shortNameOrSpecial());
this.provider = provider;
this.fqName = fqName;
this.memberScope = scopeFactory.fun(this);
}
@Nullable
public static JavaPackageFragmentDescriptor create(
@NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope> scopeFactory
) {
JavaPackageFragmentDescriptor descriptor = new JavaPackageFragmentDescriptor(provider, fqName, scopeFactory);
return descriptor.memberScope == null ? null : descriptor;
}
@NotNull
@Override
public ModuleDescriptor getContainingDeclaration() {
return provider.getModule();
}
@Nullable
@Override
public DeclarationDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
return this;
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitPackageFragmentDescriptor(this, data);
}
@NotNull
@Override
public JavaPackageFragmentScope getMemberScope() {
return memberScope;
}
@NotNull
@Override
public FqName getFqName() {
return fqName;
}
@NotNull
public JavaPackageFragmentProvider getProvider() {
return provider;
}
} }
@@ -0,0 +1,93 @@
/*
* 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.descriptor;
import com.intellij.util.NullableFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
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.types.TypeSubstitutor;
import java.util.Collections;
public class JavaPackageFragmentDescriptorImpl extends DeclarationDescriptorImpl implements JavaPackageFragmentDescriptor {
private final JavaPackageFragmentProvider provider;
private final FqName fqName;
private final JavaPackageFragmentScope memberScope;
private JavaPackageFragmentDescriptorImpl(
@NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope> scopeFactory
) {
super(Collections.<AnnotationDescriptor>emptyList(), fqName.shortNameOrSpecial());
this.provider = provider;
this.fqName = fqName;
this.memberScope = scopeFactory.fun(this);
}
@Nullable
public static JavaPackageFragmentDescriptorImpl create(
@NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope> scopeFactory
) {
JavaPackageFragmentDescriptorImpl descriptor = new JavaPackageFragmentDescriptorImpl(provider, fqName, scopeFactory);
return descriptor.memberScope == null ? null : descriptor;
}
@NotNull
@Override
public ModuleDescriptor getContainingDeclaration() {
return provider.getModule();
}
@Nullable
@Override
public DeclarationDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
return this;
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitPackageFragmentDescriptor(this, data);
}
@NotNull
@Override
public JavaPackageFragmentScope getMemberScope() {
return memberScope;
}
@NotNull
@Override
public FqName getFqName() {
return fqName;
}
@NotNull
public JavaPackageFragmentProvider getProvider() {
return provider;
}
}
@@ -23,9 +23,9 @@ import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.structure.*; import org.jetbrains.jet.lang.resolve.java.structure.*;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -286,7 +286,7 @@ public final class DescriptorResolverUtils {
// +-- package fragment Bar // +-- package fragment Bar
// We need to find class 'Baz' in fragment 'foo.Bar'. // We need to find class 'Baz' in fragment 'foo.Bar'.
@Nullable @Nullable
static JavaClassDescriptor findClassInPackage(@NotNull JavaPackageFragmentDescriptor fragment, @NotNull Name name) { static JavaClassDescriptor findClassInPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment, @NotNull Name name) {
// First, try to find in fragment directly // First, try to find in fragment directly
JavaClassDescriptor found = findClassInScope(fragment.getMemberScope(), name); JavaClassDescriptor found = findClassInScope(fragment.getMemberScope(), name);
if (found != null) { if (found != null) {
@@ -294,7 +294,7 @@ public final class DescriptorResolverUtils {
} }
// If unsuccessful, try to find class of the same name as current (class 'foo.Bar') // If unsuccessful, try to find class of the same name as current (class 'foo.Bar')
JavaPackageFragmentDescriptor parentPackage = getParentPackage(fragment); JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) { if (parentPackage == null) {
return null; return null;
} }
@@ -310,20 +310,20 @@ public final class DescriptorResolverUtils {
} }
@Nullable @Nullable
private static JavaPackageFragmentDescriptor getParentPackage(@NotNull JavaPackageFragmentDescriptor fragment) { private static JavaPackageFragmentDescriptorImpl getParentPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
FqName fqName = fragment.getFqName(); FqName fqName = fragment.getFqName();
if (fqName.isRoot()) { if (fqName.isRoot()) {
return null; return null;
} }
JavaPackageFragmentDescriptor parentPackage = fragment.getProvider().getOrCreatePackage(fqName.parent()); JavaPackageFragmentDescriptorImpl parentPackage = fragment.getProvider().getOrCreatePackage(fqName.parent());
assert parentPackage != null : " couldn't find parent package for " + fragment; assert parentPackage != null : " couldn't find parent package for " + fragment;
return parentPackage; return parentPackage;
} }
@Nullable @Nullable
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptor fragment) { public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
JavaPackageFragmentDescriptor parentPackage = getParentPackage(fragment); JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) { if (parentPackage == null) {
return null; return null;
} }
@@ -334,10 +334,10 @@ public final class DescriptorResolverUtils {
@Nullable @Nullable
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) { public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class); PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
assert packageFragment instanceof JavaPackageFragmentDescriptor : assert packageFragment instanceof JavaPackageFragmentDescriptorImpl :
"java class " + javaClass + " is under non-java fragment: " + packageFragment; "java class " + javaClass + " is under non-java fragment: " + packageFragment;
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider(); JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptorImpl) packageFragment).getProvider();
return provider.getOrCreatePackage(getFqNameSafe(javaClass)); return provider.getOrCreatePackage(getFqNameSafe(javaClass));
} }
@@ -21,10 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaMethodDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.scope.NamedMembers; import org.jetbrains.jet.lang.resolve.java.scope.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod; import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
import org.jetbrains.jet.lang.resolve.java.structure.JavaType; import org.jetbrains.jet.lang.resolve.java.structure.JavaType;
@@ -197,8 +194,8 @@ public final class JavaFunctionResolver {
} }
} }
if (owner instanceof JavaPackageFragmentDescriptor) { if (owner instanceof JavaPackageFragmentDescriptorImpl) {
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptor) owner, members); SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptorImpl) owner, members);
if (samConstructor != null) { if (samConstructor != null) {
functionsFromCurrent.add(samConstructor); functionsFromCurrent.add(samConstructor);
} }
@@ -228,7 +225,7 @@ public final class JavaFunctionResolver {
} }
@Nullable @Nullable
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) { public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptorImpl owner, @NotNull NamedMembers namedMembers) {
if (namedMembers.getSamInterface() != null) { if (namedMembers.getSamInterface() != null) {
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName()); JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
if (klass != null) { if (klass != null) {
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinder; import org.jetbrains.jet.lang.resolve.java.JavaClassFinder;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; 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.JavaPackageFragmentScope;
@@ -45,7 +46,7 @@ import java.util.*;
public final class JavaPackageFragmentProvider implements PackageFragmentProvider { public final class JavaPackageFragmentProvider implements PackageFragmentProvider {
@NotNull @NotNull
private final Map<FqName, JavaPackageFragmentDescriptor> packageFragments = Maps.newHashMap(); private final Map<FqName, JavaPackageFragmentDescriptorImpl> packageFragments = Maps.newHashMap();
private JavaClassFinder javaClassFinder; private JavaClassFinder javaClassFinder;
private JavaResolverCache cache; private JavaResolverCache cache;
@@ -95,7 +96,7 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
@NotNull @NotNull
@Override @Override
public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) { public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) {
JavaPackageFragmentDescriptor packageFragment = getOrCreatePackage(fqName); JavaPackageFragmentDescriptorImpl packageFragment = getOrCreatePackage(fqName);
if (packageFragment == null) { if (packageFragment == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -104,12 +105,12 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
} }
@Nullable @Nullable
public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull final FqName fqName) { public JavaPackageFragmentDescriptorImpl getOrCreatePackage(@NotNull final FqName fqName) {
if (packageFragments.containsKey(fqName)) { if (packageFragments.containsKey(fqName)) {
return packageFragments.get(fqName); return packageFragments.get(fqName);
} }
JavaPackageFragmentDescriptor packageFragment = JavaPackageFragmentDescriptor.create( JavaPackageFragmentDescriptorImpl packageFragment = JavaPackageFragmentDescriptorImpl.create(
this, fqName, new NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope>() { this, fqName, new NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope>() {
@Override @Override
@Nullable @Nullable
@@ -19,7 +19,7 @@ package org.jetbrains.jet.lang.resolve.java.scope;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.*; import org.jetbrains.jet.lang.resolve.java.resolver.*;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
@@ -97,7 +97,7 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
if (members == null) { if (members == null) {
return Collections.emptySet(); return Collections.emptySet();
} }
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptor) descriptor, members); SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptorImpl) descriptor, members);
if (samConstructor == null) { if (samConstructor == null) {
return Collections.emptySet(); return Collections.emptySet();
} }