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.renderer;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.kotlin.descriptors.ClassifierDescriptor;
021    import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
022    import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
023    import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
024    import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
025    import org.jetbrains.kotlin.name.FqNameBase;
026    import org.jetbrains.kotlin.name.Name;
027    import org.jetbrains.kotlin.types.JetType;
028    import org.jetbrains.kotlin.types.TypeProjection;
029    
030    import java.util.List;
031    
032    public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> {
033        DescriptorRenderer COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder().setWithDefinedIn(false).build();
034    
035        DescriptorRenderer COMPACT = new DescriptorRendererBuilder()
036                .setWithDefinedIn(false)
037                .setModifiers().build();
038    
039        DescriptorRenderer COMPACT_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
040                .setModifiers()
041                .setNameShortness(NameShortness.SHORT)
042                .setParameterNameRenderingPolicy(ParameterNameRenderingPolicy.ONLY_NON_SYNTHESIZED).build();
043    
044        DescriptorRenderer STARTS_FROM_NAME = new DescriptorRendererBuilder()
045                .setWithDefinedIn(false)
046                .setModifiers()
047                .setStartFromName(true).build();
048    
049        DescriptorRenderer ONLY_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
050                .setWithDefinedIn(false)
051                .setModifiers()
052                .setNameShortness(NameShortness.SHORT)
053                .setWithoutTypeParameters(true)
054                .setParameterNameRenderingPolicy(ParameterNameRenderingPolicy.NONE)
055                .setReceiverAfterName(true)
056                .setRenderCompanionObjectName(true)
057                .setWithoutSuperTypes(true)
058                .setStartFromName(true).build();
059    
060        DescriptorRenderer FQ_NAMES_IN_TYPES = new DescriptorRendererBuilder().build();
061    
062        DescriptorRenderer SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder()
063                .setNameShortness(NameShortness.SHORT)
064                .setParameterNameRenderingPolicy(ParameterNameRenderingPolicy.ONLY_NON_SYNTHESIZED)
065                .build();
066    
067        DescriptorRenderer DEBUG_TEXT = new DescriptorRendererBuilder()
068                .setDebugMode(true)
069                .setNameShortness(NameShortness.FULLY_QUALIFIED)
070                .build();
071    
072        DescriptorRenderer FLEXIBLE_TYPES_FOR_CODE = new DescriptorRendererBuilder()
073                .setFlexibleTypesForCode(true)
074                .build();
075    
076        DescriptorRenderer HTML_COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder()
077                .setWithDefinedIn(false)
078                .setTextFormat(TextFormat.HTML).build();
079    
080        DescriptorRenderer HTML_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
081                .setWithDefinedIn(false)
082                .setNameShortness(NameShortness.SHORT)
083                .setRenderCompanionObjectName(true)
084                .setTextFormat(TextFormat.HTML).build();
085    
086        DescriptorRenderer HTML = new DescriptorRendererBuilder().setTextFormat(TextFormat.HTML).build();
087    
088        DescriptorRenderer HTML_FOR_UNINFERRED_TYPE_PARAMS = new DescriptorRendererBuilder()
089                .setUninferredTypeParameterAsName(true)
090                .setModifiers()
091                .setNameShortness(NameShortness.SHORT)
092                .setTextFormat(TextFormat.HTML).build();
093    
094        DescriptorRenderer DEPRECATION = new DescriptorRendererBuilder()
095                .setWithDefinedIn(false)
096                .setModifiers()
097                .setNameShortness(NameShortness.SHORT)
098                .setWithoutTypeParameters(false)
099                .setParameterNameRenderingPolicy(ParameterNameRenderingPolicy.NONE)
100                .setReceiverAfterName(false)
101                .setRenderCompanionObjectName(true)
102                .setRenderAccessors(true)
103                .setWithoutSuperTypes(true)
104                .setRenderDefaultValues(false)
105                .setStartFromName(true).build();
106    
107        @NotNull
108        String renderType(@NotNull JetType type);
109    
110        @NotNull
111        String renderTypeArguments(@NotNull List<TypeProjection> typeArguments);
112    
113        @NotNull
114        String renderClassifierName(@NotNull ClassifierDescriptor klass);
115    
116        @NotNull
117        String renderAnnotation(@NotNull AnnotationDescriptor annotation);
118    
119        @NotNull
120        @Override
121        String render(@NotNull DeclarationDescriptor declarationDescriptor);
122    
123        @NotNull
124        String renderFunctionParameters(@NotNull FunctionDescriptor functionDescriptor);
125    
126        @NotNull
127        String renderName(@NotNull Name name);
128    
129        @NotNull
130        String renderFqName(@NotNull FqNameBase fqName);
131    
132        enum TextFormat {
133            PLAIN, HTML
134        }
135    
136        enum OverrideRenderingPolicy {
137            RENDER_OVERRIDE, RENDER_OPEN, RENDER_OPEN_OVERRIDE
138        }
139    
140        enum ParameterNameRenderingPolicy {
141            ALL, ONLY_NON_SYNTHESIZED, NONE
142        }
143    
144        enum Modifier {
145            VISIBILITY, MODALITY, OVERRIDE, ANNOTATIONS, INNER, MEMBER_KIND
146        }
147    
148        /** @see DefaultValueParameterHandler */
149        interface ValueParametersHandler {
150            void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
151            void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
152    
153            void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
154            void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
155        }
156    
157        class DefaultValueParameterHandler implements ValueParametersHandler {
158            @Override
159            public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
160                stringBuilder.append("(");
161            }
162    
163            @Override
164            public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
165                stringBuilder.append(")");
166            }
167    
168            @Override
169            public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
170            }
171    
172            @Override
173            public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
174                FunctionDescriptor function = (FunctionDescriptor) parameter.getContainingDeclaration();
175                if (parameter.getIndex() != function.getValueParameters().size() - 1) {
176                    stringBuilder.append(", ");
177                }
178            }
179        }
180    }