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                .setIncludeSynthesizedParameterNames(false).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                .setWithoutFunctionParameterNames(true)
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().setNameShortness(
063                NameShortness.SHORT).setIncludeSynthesizedParameterNames(false).build();
064    
065        DescriptorRenderer DEBUG_TEXT = new DescriptorRendererBuilder()
066                .setDebugMode(true)
067                .setNameShortness(NameShortness.FULLY_QUALIFIED)
068                .build();
069    
070        DescriptorRenderer FLEXIBLE_TYPES_FOR_CODE = new DescriptorRendererBuilder()
071                .setFlexibleTypesForCode(true)
072                .build();
073    
074        DescriptorRenderer HTML_COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder()
075                .setWithDefinedIn(false)
076                .setTextFormat(TextFormat.HTML).build();
077    
078        DescriptorRenderer HTML_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
079                .setWithDefinedIn(false)
080                .setNameShortness(NameShortness.SHORT)
081                .setRenderCompanionObjectName(true)
082                .setTextFormat(TextFormat.HTML).build();
083    
084        DescriptorRenderer HTML = new DescriptorRendererBuilder().setTextFormat(TextFormat.HTML).build();
085    
086        DescriptorRenderer HTML_FOR_UNINFERRED_TYPE_PARAMS = new DescriptorRendererBuilder()
087                .setUninferredTypeParameterAsName(true)
088                .setModifiers()
089                .setNameShortness(NameShortness.SHORT)
090                .setTextFormat(TextFormat.HTML).build();
091    
092        @NotNull
093        String renderType(@NotNull JetType type);
094    
095        @NotNull
096        String renderTypeArguments(@NotNull List<TypeProjection> typeArguments);
097    
098        @NotNull
099        String renderClassifierName(@NotNull ClassifierDescriptor klass);
100    
101        @NotNull
102        String renderAnnotation(@NotNull AnnotationDescriptor annotation);
103    
104        @NotNull
105        @Override
106        String render(@NotNull DeclarationDescriptor declarationDescriptor);
107    
108        @NotNull
109        String renderFunctionParameters(@NotNull FunctionDescriptor functionDescriptor);
110    
111        @NotNull
112        String renderName(@NotNull Name name);
113    
114        @NotNull
115        String renderFqName(@NotNull FqNameBase fqName);
116    
117        enum TextFormat {
118            PLAIN, HTML
119        }
120    
121        enum OverrideRenderingPolicy {
122            RENDER_OVERRIDE, RENDER_OPEN, RENDER_OPEN_OVERRIDE
123        }
124    
125        enum Modifier {
126            VISIBILITY, MODALITY, OVERRIDE, ANNOTATIONS, INNER, MEMBER_KIND
127        }
128    
129        /** @see DefaultValueParameterHandler */
130        interface ValueParametersHandler {
131            void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
132            void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
133    
134            void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
135            void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
136        }
137    
138        class DefaultValueParameterHandler implements ValueParametersHandler {
139            @Override
140            public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
141                stringBuilder.append("(");
142            }
143    
144            @Override
145            public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
146                stringBuilder.append(")");
147            }
148    
149            @Override
150            public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
151            }
152    
153            @Override
154            public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
155                FunctionDescriptor function = (FunctionDescriptor) parameter.getContainingDeclaration();
156                if (parameter.getIndex() != function.getValueParameters().size() - 1) {
157                    stringBuilder.append(", ");
158                }
159            }
160        }
161    }