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