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