001/* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.jetbrains.jet.lang.resolve.java.scope; 018 019import com.intellij.psi.PsiClass; 020import com.intellij.util.containers.ContainerUtil; 021import org.jetbrains.annotations.NotNull; 022import org.jetbrains.jet.lang.descriptors.ClassDescriptor; 023import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; 024import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; 025import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; 026import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; 027import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; 028import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider; 029import org.jetbrains.jet.lang.resolve.name.FqName; 030import org.jetbrains.jet.lang.resolve.name.Name; 031 032import java.util.Collection; 033 034import static org.jetbrains.jet.lang.resolve.java.scope.ScopeUtils.computeAllPackageDeclarations; 035 036public final class JavaClassStaticMembersScope extends JavaClassMembersScope { 037 @NotNull 038 private final FqName packageFQN; 039 040 public JavaClassStaticMembersScope( 041 @NotNull NamespaceDescriptor descriptor, 042 @NotNull ClassPsiDeclarationProvider declarationProvider, 043 @NotNull FqName packageFQN, 044 @NotNull JavaSemanticServices semanticServices 045 ) { 046 super(descriptor, declarationProvider, semanticServices); 047 this.packageFQN = packageFQN; 048 } 049 050 @Override 051 public NamespaceDescriptor getNamespace(@NotNull Name name) { 052 return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN); 053 } 054 055 @NotNull 056 @Override 057 protected Collection<DeclarationDescriptor> computeAllDescriptors() { 058 Collection<DeclarationDescriptor> result = super.computeAllDescriptors(); 059 for (PsiClass nested : declarationProvider.getPsiClass().getInnerClasses()) { 060 ContainerUtil.addIfNotNull(result, getNamespace(Name.identifier(nested.getName()))); 061 } 062 return result; 063 } 064}