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.resolver.JavaMemberResolver;
022    import org.jetbrains.jet.lang.resolve.name.LabelName;
023    import org.jetbrains.jet.lang.resolve.name.Name;
024    
025    import java.util.*;
026    
027    public abstract class JavaClassMembersScope extends JavaBaseScope {
028        private Map<Name, ClassDescriptor> innerClassesMap = null;
029    
030        protected JavaClassMembersScope(
031                @NotNull ClassOrNamespaceDescriptor descriptor,
032                @NotNull MembersProvider membersProvider,
033                @NotNull JavaMemberResolver memberResolver
034        ) {
035            super(descriptor, memberResolver, membersProvider);
036        }
037    
038        @NotNull
039        @Override
040        public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {
041            throw new UnsupportedOperationException(); // TODO
042        }
043    
044    
045        @NotNull
046        @Override
047        protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
048            NamedMembers members = membersProvider.get(name);
049            if (members == null) {
050                return Collections.emptySet();
051            }
052            return memberResolver.resolveFunctionGroupForClass(members, descriptor);
053        }
054    
055        @NotNull
056        private Map<Name, ClassDescriptor> getInnerClassesMap() {
057            if (innerClassesMap == null) {
058                Collection<ClassDescriptor> innerClasses = getInnerClasses();
059                innerClassesMap = new HashMap<Name, ClassDescriptor>();
060                for (ClassDescriptor innerClass : innerClasses) {
061                    innerClassesMap.put(innerClass.getName(), innerClass);
062                }
063            }
064            return innerClassesMap;
065        }
066    
067        @Override
068        public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
069            ClassDescriptor innerClass = getInnerClassesMap().get(name);
070            if (innerClass != null && innerClass.getKind().isObject()) {
071                return innerClass;
072            }
073            return null;
074        }
075    
076        @Override
077        public ClassifierDescriptor getClassifier(@NotNull Name name) {
078            ClassDescriptor innerClass = getInnerClassesMap().get(name);
079            if (innerClass == null || innerClass.getKind().isObject()) {
080                return null;
081            }
082            return innerClass;
083        }
084    }