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.JetType;
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.DescriptorUtilPackage.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.EMPTY, true, Kind.DECLARATION, source);
038 initialize(Collections.<TypeParameterDescriptor>emptyList(), 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);
052 }
053
054 @NotNull
055 public static PropertySetterDescriptorImpl createSetter(
056 @NotNull PropertyDescriptor propertyDescriptor,
057 @NotNull Annotations annotations,
058 boolean isDefault
059 ) {
060 PropertySetterDescriptorImpl setterDescriptor =
061 new PropertySetterDescriptorImpl(propertyDescriptor, annotations, propertyDescriptor.getModality(),
062 propertyDescriptor.getVisibility(), !isDefault, isDefault,
063 CallableMemberDescriptor.Kind.DECLARATION, null, propertyDescriptor.getSource());
064 setterDescriptor.initializeDefault();
065 return setterDescriptor;
066 }
067
068 @NotNull
069 public static PropertyGetterDescriptorImpl createDefaultGetter(
070 @NotNull PropertyDescriptor propertyDescriptor,
071 @NotNull Annotations annotations
072 ) {
073 return createGetter(propertyDescriptor, annotations, true);
074 }
075
076 @NotNull
077 public static PropertyGetterDescriptorImpl createGetter(
078 @NotNull PropertyDescriptor propertyDescriptor,
079 @NotNull Annotations annotations,
080 boolean isDefault) {
081 return new PropertyGetterDescriptorImpl(propertyDescriptor, annotations, propertyDescriptor.getModality(),
082 propertyDescriptor.getVisibility(), !isDefault, isDefault,
083 CallableMemberDescriptor.Kind.DECLARATION, null, propertyDescriptor.getSource());
084 }
085
086 @NotNull
087 public static ConstructorDescriptorImpl createPrimaryConstructorForObject(
088 @NotNull ClassDescriptor containingClass,
089 @NotNull SourceElement source
090 ) {
091 return new DefaultConstructorDescriptor(containingClass, source);
092 }
093
094 public static boolean isDefaultPrimaryConstructor(@NotNull ConstructorDescriptor constructor) {
095 return constructor instanceof DefaultConstructorDescriptor;
096 }
097
098 @NotNull
099 public static SimpleFunctionDescriptor createEnumValuesMethod(@NotNull ClassDescriptor enumClass) {
100 SimpleFunctionDescriptorImpl values =
101 SimpleFunctionDescriptorImpl.create(enumClass, Annotations.EMPTY, DescriptorUtils.ENUM_VALUES,
102 CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
103 return values.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
104 Collections.<ValueParameterDescriptor>emptyList(),
105 getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()), Modality.FINAL,
106 Visibilities.PUBLIC);
107 }
108
109 @NotNull
110 public static SimpleFunctionDescriptor createEnumValueOfMethod(@NotNull ClassDescriptor enumClass) {
111 SimpleFunctionDescriptorImpl valueOf =
112 SimpleFunctionDescriptorImpl.create(enumClass, Annotations.EMPTY, DescriptorUtils.ENUM_VALUE_OF,
113 CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
114 ValueParameterDescriptor parameterDescriptor = new ValueParameterDescriptorImpl(
115 valueOf, null, 0, Annotations.EMPTY, Name.identifier("value"), getBuiltIns(enumClass).getStringType(), false, null,
116 enumClass.getSource()
117 );
118 return valueOf.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
119 Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(), Modality.FINAL,
120 Visibilities.PUBLIC);
121 }
122
123 @Nullable
124 public static ReceiverParameterDescriptor createExtensionReceiverParameterForCallable(
125 @NotNull CallableDescriptor owner,
126 @Nullable JetType receiverParameterType
127 ) {
128 return receiverParameterType == null
129 ? null
130 : new ReceiverParameterDescriptorImpl(owner, new ExtensionReceiver(owner, receiverParameterType));
131 }
132 }