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 }