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
@@ -19,7 +19,7 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
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;
public class JavaVisibilities {
@@ -67,9 +67,9 @@ public class JavaVisibilities {
// protected static function or property
else {
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
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptor) whatDeclarationDescriptor);
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptorImpl) whatDeclarationDescriptor);
}
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
@@ -16,79 +16,7 @@
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.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 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;
}
public interface JavaPackageFragmentDescriptor extends PackageFragmentDescriptor {
}
@@ -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.OverridingUtil;
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.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.structure.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -286,7 +286,7 @@ public final class DescriptorResolverUtils {
// +-- package fragment Bar
// We need to find class 'Baz' in fragment 'foo.Bar'.
@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
JavaClassDescriptor found = findClassInScope(fragment.getMemberScope(), name);
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')
JavaPackageFragmentDescriptor parentPackage = getParentPackage(fragment);
JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) {
return null;
}
@@ -310,20 +310,20 @@ public final class DescriptorResolverUtils {
}
@Nullable
private static JavaPackageFragmentDescriptor getParentPackage(@NotNull JavaPackageFragmentDescriptor fragment) {
private static JavaPackageFragmentDescriptorImpl getParentPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
FqName fqName = fragment.getFqName();
if (fqName.isRoot()) {
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;
return parentPackage;
}
@Nullable
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptor fragment) {
JavaPackageFragmentDescriptor parentPackage = getParentPackage(fragment);
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) {
return null;
}
@@ -334,10 +334,10 @@ public final class DescriptorResolverUtils {
@Nullable
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
assert packageFragment instanceof JavaPackageFragmentDescriptor :
assert packageFragment instanceof JavaPackageFragmentDescriptorImpl :
"java class " + javaClass + " is under non-java fragment: " + packageFragment;
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider();
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptorImpl) packageFragment).getProvider();
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.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
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.descriptor.*;
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.JavaType;
@@ -197,8 +194,8 @@ public final class JavaFunctionResolver {
}
}
if (owner instanceof JavaPackageFragmentDescriptor) {
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptor) owner, members);
if (owner instanceof JavaPackageFragmentDescriptorImpl) {
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptorImpl) owner, members);
if (samConstructor != null) {
functionsFromCurrent.add(samConstructor);
}
@@ -228,7 +225,7 @@ public final class JavaFunctionResolver {
}
@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) {
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
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.PackageClassUtils;
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.JavaFullPackageScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageFragmentScope;
@@ -45,7 +46,7 @@ import java.util.*;
public final class JavaPackageFragmentProvider implements PackageFragmentProvider {
@NotNull
private final Map<FqName, JavaPackageFragmentDescriptor> packageFragments = Maps.newHashMap();
private final Map<FqName, JavaPackageFragmentDescriptorImpl> packageFragments = Maps.newHashMap();
private JavaClassFinder javaClassFinder;
private JavaResolverCache cache;
@@ -95,7 +96,7 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
@NotNull
@Override
public Collection<FqName> getSubPackagesOf(@NotNull FqName fqName) {
JavaPackageFragmentDescriptor packageFragment = getOrCreatePackage(fqName);
JavaPackageFragmentDescriptorImpl packageFragment = getOrCreatePackage(fqName);
if (packageFragment == null) {
return Collections.emptyList();
}
@@ -104,12 +105,12 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
}
@Nullable
public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull final FqName fqName) {
public JavaPackageFragmentDescriptorImpl getOrCreatePackage(@NotNull final FqName fqName) {
if (packageFragments.containsKey(fqName)) {
return packageFragments.get(fqName);
}
JavaPackageFragmentDescriptor packageFragment = JavaPackageFragmentDescriptor.create(
JavaPackageFragmentDescriptorImpl packageFragment = JavaPackageFragmentDescriptorImpl.create(
this, fqName, new NullableFunction<JavaPackageFragmentDescriptor, JavaPackageFragmentScope>() {
@Override
@Nullable
@@ -19,7 +19,7 @@ package org.jetbrains.jet.lang.resolve.java.scope;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
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.resolver.*;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
@@ -97,7 +97,7 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
if (members == null) {
return Collections.emptySet();
}
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptor) descriptor, members);
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptorImpl) descriptor, members);
if (samConstructor == null) {
return Collections.emptySet();
}