001    /*
002     * Copyright 2010-2014 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.jet.renderer;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
021    import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
022    import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
023    import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
024    import org.jetbrains.jet.lang.types.JetType;
025    import org.jetbrains.jet.lang.types.TypeProjection;
026    
027    import java.util.List;
028    
029    public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> {
030        DescriptorRenderer COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder().setWithDefinedIn(false).build();
031    
032        DescriptorRenderer SOURCE_CODE = new DescriptorRendererBuilder()
033                .setNormalizedVisibilities(true)
034                .setWithDefinedIn(false)
035                .setShortNames(false)
036                .setShowInternalKeyword(false)
037                .setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
038                .setUnitReturnType(false).build();
039    
040        DescriptorRenderer SOURCE_CODE_SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder()
041                .setNormalizedVisibilities(true)
042                .setWithDefinedIn(false)
043                .setShortNames(true)
044                .setShowInternalKeyword(false)
045                .setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
046                .setUnitReturnType(false).build();
047    
048        DescriptorRenderer COMPACT = new DescriptorRendererBuilder()
049                .setWithDefinedIn(false)
050                .setModifiers().build();
051    
052        DescriptorRenderer COMPACT_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
053                .setWithDefinedIn(false)
054                .setModifiers()
055                .setShortNames(true)
056                .setIncludeSynthesizedParameterNames(false).build();
057    
058        DescriptorRenderer STARTS_FROM_NAME = new DescriptorRendererBuilder()
059                .setWithDefinedIn(false)
060                .setModifiers()
061                .setStartFromName(true).build();
062    
063        DescriptorRenderer ONLY_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
064                .setWithDefinedIn(false)
065                .setModifiers()
066                .setShortNames(true)
067                .setWithoutTypeParameters(true)
068                .setWithoutFunctionParameterNames(true)
069                .setReceiverAfterName(true)
070                .setRenderClassObjectName(true)
071                .setWithoutSuperTypes(true)
072                .setStartFromName(true).build();
073    
074        DescriptorRenderer FQ_NAMES_IN_TYPES = new DescriptorRendererBuilder().build();
075    
076        DescriptorRenderer SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder().setShortNames(true).setIncludeSynthesizedParameterNames(false).build();
077    
078        DescriptorRenderer DEBUG_TEXT = new DescriptorRendererBuilder().setDebugMode(true).build();
079    
080        DescriptorRenderer HTML_COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder()
081                .setWithDefinedIn(false)
082                .setTextFormat(TextFormat.HTML).build();
083    
084        DescriptorRenderer HTML_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
085                .setWithDefinedIn(false)
086                .setShortNames(true)
087                .setTextFormat(TextFormat.HTML).build();
088    
089        DescriptorRenderer HTML = new DescriptorRendererBuilder().setTextFormat(TextFormat.HTML).build();
090    
091        DescriptorRenderer HTML_FOR_UNINFERRED_TYPE_PARAMS = new DescriptorRendererBuilder()
092                .setUninferredTypeParameterAsName(true)
093                .setModifiers()
094                .setShortNames(true)
095                .setTextFormat(TextFormat.HTML).build();
096    
097        @NotNull
098        String renderType(@NotNull JetType type);
099    
100        @NotNull
101        String renderTypeArguments(@NotNull List<TypeProjection> typeArguments);
102    
103        @NotNull
104        String renderAnnotation(@NotNull AnnotationDescriptor annotation);
105    
106        @NotNull
107        @Override
108        String render(@NotNull DeclarationDescriptor declarationDescriptor);
109    
110        @NotNull
111        String renderFunctionParameters(@NotNull FunctionDescriptor functionDescriptor);
112    
113        enum TextFormat {
114            PLAIN, HTML
115        }
116    
117        enum OverrideRenderingPolicy {
118            RENDER_OVERRIDE, RENDER_OPEN, RENDER_OPEN_OVERRIDE
119        }
120    
121        enum Modifier {
122            VISIBILITY, MODALITY, OVERRIDE, ANNOTATIONS, INNER, MEMBER_KIND
123        }
124    
125        /** @see DefaultValueParameterHandler */
126        interface ValueParametersHandler {
127            void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
128            void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
129    
130            void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
131            void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
132        }
133    
134        class DefaultValueParameterHandler implements ValueParametersHandler {
135            @Override
136            public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
137                stringBuilder.append("(");
138            }
139    
140            @Override
141            public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
142                stringBuilder.append(")");
143            }
144    
145            @Override
146            public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
147            }
148    
149            @Override
150            public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
151                FunctionDescriptor function = (FunctionDescriptor) parameter.getContainingDeclaration();
152                if (parameter.getIndex() != function.getValueParameters().size() - 1) {
153                    stringBuilder.append(", ");
154                }
155            }
156        }
157    }