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 HTML_COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder()
066 .setWithDefinedIn(false)
067 .setTextFormat(TextFormat.HTML).build();
068
069 DescriptorRenderer HTML_NAMES_WITH_SHORT_TYPES = new DescriptorRendererBuilder()
070 .setWithDefinedIn(false)
071 .setShortNames(true)
072 .setRenderClassObjectName(true)
073 .setTextFormat(TextFormat.HTML).build();
074
075 DescriptorRenderer HTML = new DescriptorRendererBuilder().setTextFormat(TextFormat.HTML).build();
076
077 DescriptorRenderer HTML_FOR_UNINFERRED_TYPE_PARAMS = new DescriptorRendererBuilder()
078 .setUninferredTypeParameterAsName(true)
079 .setModifiers()
080 .setShortNames(true)
081 .setTextFormat(TextFormat.HTML).build();
082
083 @NotNull
084 String renderType(@NotNull JetType type);
085
086 @NotNull
087 String renderTypeArguments(@NotNull List<TypeProjection> typeArguments);
088
089 @NotNull
090 String renderAnnotation(@NotNull AnnotationDescriptor annotation);
091
092 @NotNull
093 @Override
094 String render(@NotNull DeclarationDescriptor declarationDescriptor);
095
096 @NotNull
097 String renderFunctionParameters(@NotNull FunctionDescriptor functionDescriptor);
098
099 @NotNull
100 String renderName(@NotNull Name name);
101
102 @NotNull
103 String renderFqName(@NotNull FqNameBase fqName);
104
105 enum TextFormat {
106 PLAIN, HTML
107 }
108
109 enum OverrideRenderingPolicy {
110 RENDER_OVERRIDE, RENDER_OPEN, RENDER_OPEN_OVERRIDE
111 }
112
113 enum Modifier {
114 VISIBILITY, MODALITY, OVERRIDE, ANNOTATIONS, INNER, MEMBER_KIND
115 }
116
117 /** @see DefaultValueParameterHandler */
118 interface ValueParametersHandler {
119 void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
120 void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder);
121
122 void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
123 void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder);
124 }
125
126 class DefaultValueParameterHandler implements ValueParametersHandler {
127 @Override
128 public void appendBeforeValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
129 stringBuilder.append("(");
130 }
131
132 @Override
133 public void appendAfterValueParameters(@NotNull FunctionDescriptor function, @NotNull StringBuilder stringBuilder) {
134 stringBuilder.append(")");
135 }
136
137 @Override
138 public void appendBeforeValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
139 }
140
141 @Override
142 public void appendAfterValueParameter(@NotNull ValueParameterDescriptor parameter, @NotNull StringBuilder stringBuilder) {
143 FunctionDescriptor function = (FunctionDescriptor) parameter.getContainingDeclaration();
144 if (parameter.getIndex() != function.getValueParameters().size() - 1) {
145 stringBuilder.append(", ");
146 }
147 }
148 }
149 }