001    /*
002     * Copyright 2010-2013 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.diagnostics.rendering.Renderer;
024    import org.jetbrains.jet.lang.types.JetType;
025    
026    public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> {
027        DescriptorRenderer COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder().setWithDefinedIn(false).build();
028    
029        DescriptorRenderer SOURCE_CODE = new DescriptorRendererBuilder()
030                .setNormalizedVisibilities(true)
031                .setWithDefinedIn(false)
032                .setShortNames(false)
033                .setShowInternalKeyword(false)
034                .setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
035                .setUnitReturnType(false).build();
036    
037        DescriptorRenderer SOURCE_CODE_SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder()
038                .setNormalizedVisibilities(true)
039                .setWithDefinedIn(false)
040                .setShortNames(true)
041                .setShowInternalKeyword(false)
042                .setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
043                .setUnitReturnType(false).build();
044    
045        DescriptorRenderer COMPACT = new DescriptorRendererBuilder()
046                .setWithDefinedIn(false)
047                .setModifiers().build();
048    
049        DescriptorRenderer STARTS_FROM_NAME = new DescriptorRendererBuilder()
050                .setWithDefinedIn(false)
051                .setModifiers()
052                .setStartFromName(true).build();
053    
054        DescriptorRenderer TEXT = new DescriptorRendererBuilder().build();
055    
056        DescriptorRenderer SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder().setShortNames(true).build();
057    
058        DescriptorRenderer DEBUG_TEXT = new DescriptorRendererBuilder().setDebugMode(true).build();
059    
060        DescriptorRenderer HTML = new DescriptorRendererBuilder().setTextFormat(TextFormat.HTML).build();
061    
062        @NotNull
063        String renderType(@NotNull JetType type);
064    
065        @NotNull
066        @Override
067        String render(@NotNull DeclarationDescriptor declarationDescriptor);
068    
069        @NotNull
070        String renderFunctionParameters(@NotNull FunctionDescriptor functionDescriptor);
071    
072        enum TextFormat {
073            PLAIN, HTML
074        }
075    
076        enum OverrideRenderingPolicy {
077            RENDER_OVERRIDE, RENDER_OPEN, RENDER_OPEN_OVERRIDE
078        }
079    
080        enum Modifier {
081            VISIBILITY, MODALITY, OVERRIDE, ANNOTATIONS, INNER, MEMBER_KIND
082        }
083    
084        /** @see DefaultValueParameterHandler */
085        interface ValueParametersHandler {
086            void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
087            void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
088    
089            void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
090            void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
091        }
092    
093        class DefaultValueParameterHandler implements ValueParametersHandler {
094            @Override
095            public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
096                stringBuilder.append("(");
097            }
098    
099            @Override
100            public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
101                stringBuilder.append(")");
102            }
103    
104            @Override
105            public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
106            }
107    
108            @Override
109            public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
110                FunctionDescriptor function = (FunctionDescriptor) parameter.getContainingDeclaration();
111                if (parameter.getIndex() != function.getValueParameters().size() - 1) {
112                    stringBuilder.append(", ");
113                }
114            }
115        }
116    }