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.codegen; 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.ClassDescriptorBase; 024 import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl; 025 import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorImpl; 026 import org.jetbrains.kotlin.name.Name; 027 import org.jetbrains.kotlin.resolve.scopes.JetScope; 028 import org.jetbrains.kotlin.storage.LockBasedStorageManager; 029 import org.jetbrains.kotlin.types.JetType; 030 import org.jetbrains.kotlin.types.TypeConstructor; 031 import org.jetbrains.kotlin.types.TypeConstructorImpl; 032 import org.jetbrains.kotlin.types.TypeUtils; 033 034 import java.util.*; 035 036 public class MutableClassDescriptor extends ClassDescriptorBase implements ClassDescriptor { 037 private final ClassKind kind; 038 private final boolean isInner; 039 040 private Modality modality; 041 private Visibility visibility; 042 private TypeConstructor typeConstructor; 043 private List<TypeParameterDescriptor> typeParameters; 044 private final Collection<JetType> supertypes = new ArrayList<JetType>(); 045 046 public MutableClassDescriptor( 047 @NotNull DeclarationDescriptor containingDeclaration, 048 @NotNull ClassKind kind, 049 boolean isInner, 050 @NotNull Name name, 051 @NotNull SourceElement source 052 ) { 053 super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source); 054 assert kind != ClassKind.OBJECT : "Fix isCompanionObject()"; 055 056 this.kind = kind; 057 this.isInner = isInner; 058 } 059 060 @Nullable 061 @Override 062 public ClassDescriptor getCompanionObjectDescriptor() { 063 return null; 064 } 065 066 @NotNull 067 @Override 068 public Annotations getAnnotations() { 069 return Annotations.EMPTY; 070 } 071 072 public void setModality(@NotNull Modality modality) { 073 this.modality = modality; 074 } 075 076 @Override 077 @NotNull 078 public Modality getModality() { 079 return modality; 080 } 081 082 @NotNull 083 @Override 084 public ClassKind getKind() { 085 return kind; 086 } 087 088 public void setVisibility(@NotNull Visibility visibility) { 089 this.visibility = visibility; 090 } 091 092 @NotNull 093 @Override 094 public Visibility getVisibility() { 095 return visibility; 096 } 097 098 @Override 099 public boolean isInner() { 100 return isInner; 101 } 102 103 @Override 104 public boolean isCompanionObject() { 105 return false; 106 } 107 108 @NotNull 109 @Override 110 public TypeConstructor getTypeConstructor() { 111 return typeConstructor; 112 } 113 114 public void addSupertype(@NotNull JetType supertype) { 115 assert !supertype.isError() : "Error types must be filtered out in DescriptorResolver"; 116 if (TypeUtils.getClassDescriptor(supertype) != null) { 117 // See the Errors.SUPERTYPE_NOT_A_CLASS_OR_TRAIT 118 supertypes.add(supertype); 119 } 120 } 121 122 @NotNull 123 @Override 124 public Set<ConstructorDescriptor> getConstructors() { 125 return Collections.emptySet(); 126 } 127 128 @Override 129 @Nullable 130 public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() { 131 return null; 132 } 133 134 public void setTypeParameterDescriptors(@NotNull List<TypeParameterDescriptor> typeParameters) { 135 if (this.typeParameters != null) { 136 throw new IllegalStateException("Type parameters are already set for " + getName()); 137 } 138 this.typeParameters = new ArrayList<TypeParameterDescriptor>(typeParameters); 139 } 140 141 public void createTypeConstructor() { 142 assert typeConstructor == null : typeConstructor; 143 this.typeConstructor = TypeConstructorImpl.createForClass( 144 this, 145 Annotations.EMPTY, 146 !getModality().isOverridable(), 147 getName().asString(), 148 typeParameters, 149 supertypes 150 ); 151 for (FunctionDescriptor functionDescriptor : getConstructors()) { 152 ((ConstructorDescriptorImpl) functionDescriptor).setReturnType(getDefaultType()); 153 } 154 } 155 156 @Override 157 @NotNull 158 public JetScope getUnsubstitutedMemberScope() { 159 return JetScope.Empty.INSTANCE$; // used for getDefaultType 160 } 161 162 @NotNull 163 @Override 164 public JetScope getStaticScope() { 165 return JetScope.Empty.INSTANCE$; 166 } 167 168 @Override 169 public String toString() { 170 return DeclarationDescriptorImpl.toString(this); 171 } 172 }