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    
017    package org.jetbrains.jet.lang.resolve.java.scope;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.jet.lang.descriptors.*;
021    import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
022    import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
023    import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver;
024    import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
025    import org.jetbrains.jet.lang.resolve.java.resolver.ProgressChecker;
026    import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
027    import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
028    import org.jetbrains.jet.lang.resolve.name.FqName;
029    import org.jetbrains.jet.lang.resolve.name.Name;
030    
031    import java.util.Collection;
032    import java.util.Collections;
033    import java.util.HashSet;
034    import java.util.Set;
035    
036    import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES;
037    import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_KOTLIN_SOURCES;
038    
039    public final class JavaPackageScope extends JavaBaseScope {
040        @NotNull
041        private final JavaPackage javaPackage;
042        @NotNull
043        private final FqName packageFQN;
044    
045        public JavaPackageScope(
046                @NotNull NamespaceDescriptor descriptor,
047                @NotNull JavaPackage javaPackage,
048                @NotNull FqName packageFQN,
049                @NotNull JavaMemberResolver memberResolver
050        ) {
051            super(descriptor, memberResolver, MembersProvider.forPackage(javaPackage));
052            this.javaPackage = javaPackage;
053            this.packageFQN = packageFQN;
054        }
055    
056        @Override
057        public ClassifierDescriptor getClassifier(@NotNull Name name) {
058            return memberResolver.resolveClass(packageFQN.child(name), IGNORE_KOTLIN_SOURCES);
059        }
060    
061        @Override
062        public NamespaceDescriptor getNamespace(@NotNull Name name) {
063            return memberResolver.resolveNamespace(packageFQN.child(name), INCLUDE_KOTLIN_SOURCES);
064        }
065    
066        @NotNull
067        @Override
068        protected Collection<DeclarationDescriptor> computeAllDescriptors() {
069            Collection<DeclarationDescriptor> result = super.computeAllDescriptors();
070            result.addAll(computeAllPackageDeclarations());
071            return result;
072        }
073    
074        @NotNull
075        private Collection<DeclarationDescriptor> computeAllPackageDeclarations() {
076            Collection<DeclarationDescriptor> result = new HashSet<DeclarationDescriptor>();
077    
078            for (JavaPackage subPackage : javaPackage.getSubPackages()) {
079                NamespaceDescriptor childNs = memberResolver.resolveNamespace(subPackage.getFqName(), IGNORE_KOTLIN_SOURCES);
080                if (childNs != null) {
081                    result.add(childNs);
082                }
083            }
084    
085            for (JavaClass javaClass : DescriptorResolverUtils.getClassesInPackage(javaPackage)) {
086                if (DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) continue;
087    
088                if (javaClass.getOriginKind() == JavaClass.OriginKind.KOTLIN_LIGHT_CLASS) continue;
089    
090                if (javaClass.getVisibility() == Visibilities.PRIVATE) continue;
091    
092                ProgressChecker.getInstance().checkCanceled();
093    
094                FqName fqName = javaClass.getFqName();
095                if (fqName == null) continue;
096    
097                ClassDescriptor classDescriptor = memberResolver.resolveClass(fqName, IGNORE_KOTLIN_SOURCES);
098                if (classDescriptor != null) {
099                    result.add(classDescriptor);
100                }
101    
102                NamespaceDescriptor namespace = memberResolver.resolveNamespace(fqName, IGNORE_KOTLIN_SOURCES);
103                if (namespace != null) {
104                    result.add(namespace);
105                }
106            }
107    
108            return result;
109        }
110    
111        @Override
112        @NotNull
113        protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
114            NamedMembers members = membersProvider.get(name);
115            if (members == null) {
116                return Collections.emptySet();
117            }
118            SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((NamespaceDescriptor) descriptor, members);
119            if (samConstructor == null) {
120                return Collections.emptySet();
121            }
122            return Collections.<FunctionDescriptor>singleton(samConstructor);
123        }
124    
125        @NotNull
126        @Override
127        protected Collection<ClassDescriptor> computeInnerClasses() {
128            return Collections.emptyList();
129        }
130    }