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