001    /*
002     * Copyright 2010-2015 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.kotlin.descriptors;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.annotations.Nullable;
021    import org.jetbrains.kotlin.descriptors.annotations.Annotations;
022    import org.jetbrains.kotlin.name.Name;
023    import org.jetbrains.kotlin.types.KotlinType;
024    import org.jetbrains.kotlin.types.TypeSubstitution;
025    import org.jetbrains.kotlin.types.TypeSubstitutor;
026    
027    import java.util.Collection;
028    import java.util.List;
029    
030    public interface FunctionDescriptor extends CallableMemberDescriptor {
031        @Override
032        @NotNull
033        DeclarationDescriptor getContainingDeclaration();
034    
035        @NotNull
036        @Override
037        FunctionDescriptor getOriginal();
038    
039        @Nullable
040        @Override
041        FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor);
042    
043        /**
044         * This method should be used with q Wgreat care, because if descriptor is substituted one, calling 'getOverriddenDescriptors'
045         * may force lazy computation, that's unnecessary in most cases.
046         * So, if 'getOriginal().getOverriddenDescriptors()' is enough for you, please use it instead.
047         * @return
048         */
049        @Override
050        @NotNull
051        Collection<? extends FunctionDescriptor> getOverriddenDescriptors();
052    
053        /**
054         * @return descriptor that represents initial signature, e.g in case of result SimpleFunctionDescriptor.createRenamedCopy it returns
055         * descriptor before rename
056         */
057        @Nullable
058        FunctionDescriptor getInitialSignatureDescriptor();
059    
060        /**
061         * @return true if descriptor signature clashed with some other signature and it's supposed to be legal
062         * See java.nio.CharBuffer
063         */
064        boolean isHiddenToOvercomeSignatureClash();
065    
066        @NotNull
067        @Override
068        FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides);
069    
070        boolean isOperator();
071    
072        boolean isInfix();
073    
074        boolean isInline();
075    
076        boolean isTailrec();
077    
078        boolean isHiddenForResolutionEverywhereBesideSupercalls();
079    
080        boolean isSuspend();
081    
082        interface UserDataKey<V> {}
083    
084        // TODO: pull up userdata related members to DeclarationDescriptor and use more efficient implementation (e.g. THashMap)
085        @Nullable
086        <V> V getUserData(UserDataKey<V> key);
087    
088        @NotNull
089        CopyBuilder<? extends FunctionDescriptor> newCopyBuilder();
090    
091        interface CopyBuilder<D extends FunctionDescriptor> {
092            @NotNull
093            CopyBuilder<D> setOwner(@NotNull DeclarationDescriptor owner);
094    
095            @NotNull
096            CopyBuilder<D> setModality(@NotNull Modality modality);
097    
098            @NotNull
099            CopyBuilder<D> setVisibility(@NotNull Visibility visibility);
100    
101            @NotNull
102            CopyBuilder<D> setKind(@NotNull Kind kind);
103    
104            @NotNull
105            CopyBuilder<D> setCopyOverrides(boolean copyOverrides);
106    
107            @NotNull
108            CopyBuilder<D> setName(@NotNull Name name);
109    
110            @NotNull
111            CopyBuilder<D> setValueParameters(@NotNull List<ValueParameterDescriptor> parameters);
112    
113            @NotNull
114            CopyBuilder<D> setTypeParameters(@NotNull List<TypeParameterDescriptor> parameters);
115    
116            @NotNull
117            CopyBuilder<D> setReturnType(@NotNull KotlinType type);
118    
119            @NotNull
120            CopyBuilder<D> setExtensionReceiverType(@Nullable KotlinType type);
121    
122            @NotNull
123            CopyBuilder<D> setDispatchReceiverParameter(@Nullable ReceiverParameterDescriptor dispatchReceiverParameter);
124    
125            @NotNull
126            CopyBuilder<D> setOriginal(@Nullable FunctionDescriptor original);
127    
128            @NotNull
129            CopyBuilder<D> setSignatureChange();
130    
131            @NotNull
132            CopyBuilder<D> setPreserveSourceElement();
133    
134            @NotNull
135            CopyBuilder<D> setSource(@NotNull SourceElement source);
136    
137            @NotNull
138            CopyBuilder<D> setDropOriginalInContainingParts();
139    
140            @NotNull
141            CopyBuilder<D> setHiddenToOvercomeSignatureClash();
142    
143            @NotNull
144            CopyBuilder<D> setHiddenForResolutionEverywhereBesideSupercalls();
145    
146            @NotNull
147            CopyBuilder<D> setAdditionalAnnotations(@NotNull Annotations additionalAnnotations);
148    
149            @NotNull
150            CopyBuilder<D> setSubstitution(@NotNull TypeSubstitution substitution);
151    
152            @NotNull
153            <V> CopyBuilder<D> putUserData(@NotNull UserDataKey<V> userDataKey, V value);
154    
155            @Nullable
156            D build();
157        }
158    }