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.scopes;
018    
019    import com.google.common.base.Function;
020    import com.google.common.collect.Collections2;
021    import com.google.common.collect.Lists;
022    import com.google.common.collect.Sets;
023    import org.jetbrains.annotations.NotNull;
024    import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
025    import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
026    import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
027    import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
028    import org.jetbrains.jet.lang.resolve.BindingTrace;
029    import org.jetbrains.jet.lang.resolve.DescriptorResolver;
030    import org.jetbrains.jet.lang.resolve.TraceBasedRedeclarationHandler;
031    import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
032    
033    import java.util.Collection;
034    import java.util.List;
035    import java.util.Set;
036    
037    public final class JetScopeUtils {
038        private JetScopeUtils() {}
039    
040        public static List<ReceiverValue> getImplicitReceiversHierarchyValues(@NotNull JetScope scope) {
041            Collection<ReceiverParameterDescriptor> hierarchy = scope.getImplicitReceiversHierarchy();
042    
043            return Lists.newArrayList(
044                    Collections2.transform(hierarchy,
045                           new Function<ReceiverParameterDescriptor, ReceiverValue>() {
046                               @Override
047                               public ReceiverValue apply(ReceiverParameterDescriptor receiverParameterDescriptor) {
048                                   return receiverParameterDescriptor.getValue();
049                               }
050                           })
051            );
052        }
053    
054        /**
055         * Get all extension descriptors among visible descriptors for current scope.
056         *
057         * @param scope Scope for query extensions.
058         * @return extension descriptors.
059         */
060        public static Collection<CallableDescriptor> getAllExtensions(@NotNull JetScope scope) {
061            Set<CallableDescriptor> result = Sets.newHashSet();
062    
063            for (DeclarationDescriptor descriptor : scope.getAllDescriptors()) {
064                if (descriptor instanceof CallableDescriptor) {
065                    CallableDescriptor callDescriptor = (CallableDescriptor) descriptor;
066                    if (callDescriptor.getReceiverParameter() != null) {
067                        result.add(callDescriptor);
068                    }
069                }
070            }
071    
072            return result;
073        }
074    
075        public static JetScope makeScopeForPropertyAccessor(
076                @NotNull PropertyDescriptor propertyDescriptor,
077                @NotNull JetScope parentScope,
078                @NotNull DescriptorResolver descriptorResolver,
079                @NotNull BindingTrace trace
080        ) {
081            JetScope propertyDeclarationInnerScope = descriptorResolver
082                    .getPropertyDeclarationInnerScope(propertyDescriptor, parentScope,
083                                                      propertyDescriptor.getTypeParameters(),
084                                                      propertyDescriptor.getReceiverParameter(), trace);
085            WritableScope accessorScope = new WritableScopeImpl(propertyDeclarationInnerScope, parentScope.getContainingDeclaration(),
086                                                                new TraceBasedRedeclarationHandler(trace), "Accessor Scope");
087            accessorScope.changeLockLevel(WritableScope.LockLevel.READING);
088    
089            return accessorScope;
090        }
091    
092    }