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 }