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.resolve;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.annotations.Nullable;
021 import org.jetbrains.kotlin.descriptors.*;
022 import org.jetbrains.kotlin.descriptors.annotations.Annotations;
023 import org.jetbrains.kotlin.descriptors.impl.*;
024 import org.jetbrains.kotlin.name.Name;
025 import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver;
026 import org.jetbrains.kotlin.types.KotlinType;
027 import org.jetbrains.kotlin.types.Variance;
028
029 import java.util.Collections;
030
031 import static org.jetbrains.kotlin.resolve.DescriptorUtils.getDefaultConstructorVisibility;
032 import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns;
033
034 public class DescriptorFactory {
035 private static class DefaultConstructorDescriptor extends ConstructorDescriptorImpl {
036 public DefaultConstructorDescriptor(@NotNull ClassDescriptor containingClass, @NotNull SourceElement source) {
037 super(containingClass, null, Annotations.Companion.getEMPTY(), true, Kind.DECLARATION, source);
038 initialize(Collections.<ValueParameterDescriptor>emptyList(),
039 getDefaultConstructorVisibility(containingClass));
040 }
041 }
042
043 private DescriptorFactory() {
044 }
045
046 @NotNull
047 public static PropertySetterDescriptorImpl createDefaultSetter(
048 @NotNull PropertyDescriptor propertyDescriptor,
049 @NotNull Annotations annotations
050 ) {
051 return createSetter(propertyDescriptor, annotations, true, false, propertyDescriptor.getSource());
052 }
053
054 @NotNull
055 public static PropertySetterDescriptorImpl createSetter(
056 @NotNull PropertyDescriptor propertyDescriptor,
057 @NotNull Annotations annotations,
058 boolean isDefault,
059 boolean isExternal,
060 @NotNull SourceElement sourceElement
061 ) {
062 return createSetter(propertyDescriptor, annotations, isDefault, isExternal, propertyDescriptor.getVisibility(), sourceElement);
063 }
064
065 @NotNull
066 public static PropertySetterDescriptorImpl createSetter(
067 @NotNull PropertyDescriptor propertyDescriptor,
068 @NotNull Annotations annotations,
069 boolean isDefault,
070 boolean isExternal,
071 @NotNull Visibility visibility,
072 @NotNull SourceElement sourceElement
073 ) {
074 PropertySetterDescriptorImpl setterDescriptor = new PropertySetterDescriptorImpl(
075 propertyDescriptor, annotations, propertyDescriptor.getModality(), visibility, isDefault, isExternal,
076 CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement
077 );
078 setterDescriptor.initializeDefault();
079 return setterDescriptor;
080 }
081
082 @NotNull
083 public static PropertyGetterDescriptorImpl createDefaultGetter(
084 @NotNull PropertyDescriptor propertyDescriptor,
085 @NotNull Annotations annotations
086 ) {
087 return createGetter(propertyDescriptor, annotations, true, false);
088 }
089
090 @NotNull
091 public static PropertyGetterDescriptorImpl createGetter(
092 @NotNull PropertyDescriptor propertyDescriptor,
093 @NotNull Annotations annotations,
094 boolean isDefault,
095 boolean isExternal
096 ) {
097 return createGetter(propertyDescriptor, annotations, isDefault, isExternal, propertyDescriptor.getSource());
098 }
099
100 @NotNull
101 public static PropertyGetterDescriptorImpl createGetter(
102 @NotNull PropertyDescriptor propertyDescriptor,
103 @NotNull Annotations annotations,
104 boolean isDefault,
105 boolean isExternal,
106 @NotNull SourceElement sourceElement
107 ) {
108 return new PropertyGetterDescriptorImpl(
109 propertyDescriptor, annotations, propertyDescriptor.getModality(), propertyDescriptor.getVisibility(),
110 isDefault, isExternal, CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement
111 );
112 }
113
114 @NotNull
115 public static ConstructorDescriptorImpl createPrimaryConstructorForObject(
116 @NotNull ClassDescriptor containingClass,
117 @NotNull SourceElement source
118 ) {
119 return new DefaultConstructorDescriptor(containingClass, source);
120 }
121
122 @NotNull
123 public static SimpleFunctionDescriptor createEnumValuesMethod(@NotNull ClassDescriptor enumClass) {
124 SimpleFunctionDescriptorImpl values =
125 SimpleFunctionDescriptorImpl.create(enumClass, Annotations.Companion.getEMPTY(), DescriptorUtils.ENUM_VALUES,
126 CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
127 return values.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
128 Collections.<ValueParameterDescriptor>emptyList(),
129 getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()),
130 Modality.FINAL, Visibilities.PUBLIC);
131 }
132
133 @NotNull
134 public static SimpleFunctionDescriptor createEnumValueOfMethod(@NotNull ClassDescriptor enumClass) {
135 SimpleFunctionDescriptorImpl valueOf =
136 SimpleFunctionDescriptorImpl.create(enumClass, Annotations.Companion.getEMPTY(), DescriptorUtils.ENUM_VALUE_OF,
137 CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
138 ValueParameterDescriptor parameterDescriptor = new ValueParameterDescriptorImpl(
139 valueOf, null, 0, Annotations.Companion.getEMPTY(), Name.identifier("value"), getBuiltIns(enumClass).getStringType(),
140 /* declaresDefaultValue = */ false,
141 /* isCrossinline = */ false,
142 /* isNoinline = */ false,
143 null,
144 enumClass.getSource()
145 );
146 return valueOf.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
147 Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(),
148 Modality.FINAL, Visibilities.PUBLIC);
149 }
150
151 @Nullable
152 public static ReceiverParameterDescriptor createExtensionReceiverParameterForCallable(
153 @NotNull CallableDescriptor owner,
154 @Nullable KotlinType receiverParameterType
155 ) {
156 return receiverParameterType == null
157 ? null
158 : new ReceiverParameterDescriptorImpl(owner, new ExtensionReceiver(owner, receiverParameterType));
159 }
160 }