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