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 }