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.name.Name;
022    import org.jetbrains.kotlin.types.KotlinType;
023    import org.jetbrains.kotlin.types.TypeSubstitutor;
024    
025    import java.util.Collection;
026    import java.util.List;
027    
028    public interface FunctionDescriptor extends CallableMemberDescriptor {
029        @Override
030        @NotNull
031        DeclarationDescriptor getContainingDeclaration();
032    
033        @NotNull
034        @Override
035        FunctionDescriptor getOriginal();
036    
037        @NotNull
038        @Override
039        FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor);
040    
041        /**
042         * This method should be used with q Wgreat care, because if descriptor is substituted one, calling 'getOverriddenDescriptors'
043         * may force lazy computation, that's unnecessary in most cases.
044         * So, if 'getOriginal().getOverriddenDescriptors()' is enough for you, please use it instead.
045         * @return
046         */
047        @Override
048        @NotNull
049        Collection<? extends FunctionDescriptor> getOverriddenDescriptors();
050    
051        /**
052         * @return descriptor that represents initial signature, e.g in case of result SimpleFunctionDescriptor.createRenamedCopy it returns
053         * descriptor before rename
054         */
055        @Nullable
056        FunctionDescriptor getInitialSignatureDescriptor();
057    
058        /**
059         * @return true if descriptor signature clashed with some other signature and it's supposed to be legal
060         * See java.nio.CharBuffer
061         */
062        boolean isHiddenToOvercomeSignatureClash();
063    
064        @NotNull
065        @Override
066        FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides);
067    
068        boolean isOperator();
069    
070        boolean isInfix();
071    
072        boolean isInline();
073    
074        boolean isTailrec();
075    
076        boolean isExternal();
077    
078        @NotNull
079        CopyBuilder<? extends FunctionDescriptor> newCopyBuilder();
080    
081        interface CopyBuilder<D extends FunctionDescriptor> {
082            @NotNull
083            CopyBuilder<D> setOwner(@NotNull DeclarationDescriptor owner);
084    
085            @NotNull
086            CopyBuilder<D> setModality(@NotNull Modality modality);
087    
088            @NotNull
089            CopyBuilder<D> setVisibility(@NotNull Visibility visibility);
090    
091            @NotNull
092            CopyBuilder<D> setKind(@NotNull Kind kind);
093    
094            @NotNull
095            CopyBuilder<D> setCopyOverrides(boolean copyOverrides);
096    
097            @NotNull
098            CopyBuilder<D> setName(@NotNull Name name);
099    
100            @NotNull
101            CopyBuilder<D> setValueParameters(@NotNull List<ValueParameterDescriptor> parameters);
102    
103            @NotNull
104            CopyBuilder<D> setTypeParameters(@NotNull List<TypeParameterDescriptor> parameters);
105    
106            @NotNull
107            CopyBuilder<D> setReturnType(@NotNull KotlinType type);
108    
109            @NotNull
110            CopyBuilder<D> setExtensionReceiverType(@Nullable KotlinType type);
111    
112            @NotNull
113            CopyBuilder<D> setOriginal(@NotNull FunctionDescriptor original);
114    
115            @NotNull
116            CopyBuilder<D> setSignatureChange();
117    
118            @NotNull
119            CopyBuilder<D> setPreserveSourceElement();
120    
121            @NotNull
122            CopyBuilder<D> setDropOriginalInContainingParts();
123    
124            @NotNull
125            CopyBuilder<D> setHiddenToOvercomeSignatureClash();
126    
127            @Nullable
128            D build();
129        }
130    }