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