Add external property to class and property descriptors

This commit is contained in:
Alexey Andreev
2016-11-24 19:37:13 +03:00
parent 43948a0170
commit ba2443bcb3
42 changed files with 120 additions and 47 deletions
@@ -78,7 +78,7 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implem
super(containingDeclaration, null, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL, super(containingDeclaration, null, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL,
original.isVar(), Name.identifier("access$" + nameSuffix), original.isVar(), Name.identifier("access$" + nameSuffix),
Kind.DECLARATION, SourceElement.NO_SOURCE, /* lateInit = */ false, /* isConst = */ false, Kind.DECLARATION, SourceElement.NO_SOURCE, /* lateInit = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isImpl = */ false); /* isPlatform = */ false, /* isImpl = */ false, /* isExternal = */ false);
this.calleeDescriptor = original; this.calleeDescriptor = original;
this.superCallTarget = superCallTarget; this.superCallTarget = superCallTarget;
@@ -308,8 +308,8 @@ class CollectionStubMethodGenerator(
} }
private fun createSyntheticSubclass(): Pair<MutableClassDescriptor, List<TypeParameterDescriptor>> { private fun createSyntheticSubclass(): Pair<MutableClassDescriptor, List<TypeParameterDescriptor>> {
val child = MutableClassDescriptor(descriptor.containingDeclaration, ClassKind.CLASS, false, val child = MutableClassDescriptor(descriptor.containingDeclaration, ClassKind.CLASS, /* isInner = */ false,
Name.special("<synthetic inheritor of ${descriptor.name}>"), descriptor.source) /* isExternal */ false, Name.special("<synthetic inheritor of ${descriptor.name}>"), descriptor.source)
child.modality = Modality.FINAL child.modality = Modality.FINAL
child.visibility = Visibilities.PUBLIC child.visibility = Visibilities.PUBLIC
val typeParameters = descriptor.typeConstructor.parameters val typeParameters = descriptor.typeConstructor.parameters
@@ -62,7 +62,8 @@ class InterfaceImplBodyCodegen(
if (DescriptorUtils.isLocal(descriptor)) return null if (DescriptorUtils.isLocal(descriptor)) return null
val classDescriptorImpl = ClassDescriptorImpl( val classDescriptorImpl = ClassDescriptorImpl(
descriptor, Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME), descriptor, Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME),
Modality.FINAL, ClassKind.CLASS, Collections.emptyList(), SourceElement.NO_SOURCE) Modality.FINAL, ClassKind.CLASS, Collections.emptyList(), SourceElement.NO_SOURCE,
/* isExternal = */ false)
classDescriptorImpl.initialize(MemberScope.Empty, emptySet(), null) classDescriptorImpl.initialize(MemberScope.Empty, emptySet(), null)
return classDescriptorImpl return classDescriptorImpl
@@ -67,7 +67,8 @@ class JvmRuntimeTypes(module: ModuleDescriptor) {
} }
private fun createClass(packageFragment: PackageFragmentDescriptor, name: String): ClassDescriptor = private fun createClass(packageFragment: PackageFragmentDescriptor, name: String): ClassDescriptor =
MutableClassDescriptor(packageFragment, ClassKind.CLASS, false, Name.identifier(name), SourceElement.NO_SOURCE).apply { MutableClassDescriptor(packageFragment, ClassKind.CLASS, /* isInner = */ false, /* isExternal = */ false,
Name.identifier(name), SourceElement.NO_SOURCE).apply {
modality = Modality.FINAL modality = Modality.FINAL
visibility = Visibilities.PUBLIC visibility = Visibilities.PUBLIC
setTypeParameterDescriptors(emptyList()) setTypeParameterDescriptors(emptyList())
@@ -47,10 +47,11 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull ClassKind kind, @NotNull ClassKind kind,
boolean isInner, boolean isInner,
boolean isExternal,
@NotNull Name name, @NotNull Name name,
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source); super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source, isExternal);
assert kind != ClassKind.OBJECT : "Fix isCompanionObject()"; assert kind != ClassKind.OBJECT : "Fix isCompanionObject()";
this.kind = kind; this.kind = kind;
@@ -84,7 +84,8 @@ public class SamWrapperCodegen {
Modality.FINAL, Modality.FINAL,
ClassKind.CLASS, ClassKind.CLASS,
Collections.singleton(samType.getType()), Collections.singleton(samType.getType()),
SourceElement.NO_SOURCE SourceElement.NO_SOURCE,
/* isExternal = */ false
); );
// e.g. compare(T, T) // e.g. compare(T, T)
SimpleFunctionDescriptor erasedInterfaceFunction = samType.getAbstractMethod().getOriginal().copy( SimpleFunctionDescriptor erasedInterfaceFunction = samType.getAbstractMethod().getOriginal().copy(
@@ -31,7 +31,8 @@ class SyntheticClassDescriptorForLambda(
name: Name, name: Name,
supertypes: Collection<KotlinType>, supertypes: Collection<KotlinType>,
element: KtElement element: KtElement
) : ClassDescriptorImpl(containingDeclaration, name, Modality.FINAL, ClassKind.CLASS, supertypes, element.toSourceElement()) { ) : ClassDescriptorImpl(containingDeclaration, name, Modality.FINAL, ClassKind.CLASS, supertypes, element.toSourceElement(),
/* isExternal = */ false) {
init { init {
initialize(MemberScope.Empty, emptySet(), null) initialize(MemberScope.Empty, emptySet(), null)
} }
@@ -280,7 +280,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l
source: SourceElement source: SourceElement
) : SyntheticJavaPropertyDescriptor, PropertyDescriptorImpl( ) : SyntheticJavaPropertyDescriptor, PropertyDescriptorImpl(
containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source, containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source,
/* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false /* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false, /* isExternal = */ false
) { ) {
override var getMethod: FunctionDescriptor by Delegates.notNull() override var getMethod: FunctionDescriptor by Delegates.notNull()
@@ -811,7 +811,8 @@ public class DescriptorResolver {
modifierList != null && modifierList.hasModifier(KtTokens.CONST_KEYWORD), modifierList != null && modifierList.hasModifier(KtTokens.CONST_KEYWORD),
modifierList != null && modifierList.hasModifier(KtTokens.PLATFORM_KEYWORD) || modifierList != null && modifierList.hasModifier(KtTokens.PLATFORM_KEYWORD) ||
containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isPlatform(), containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isPlatform(),
modifierList != null && modifierList.hasModifier(KtTokens.IMPL_KEYWORD) modifierList != null && modifierList.hasModifier(KtTokens.IMPL_KEYWORD),
modifierList != null && modifierList.hasModifier(KtTokens.EXTERNAL_KEYWORD)
); );
wrapper.setDescriptor(propertyDescriptor); wrapper.setDescriptor(propertyDescriptor);
@@ -1128,7 +1129,8 @@ public class DescriptorResolver {
/* lateInit = */ false, /* lateInit = */ false,
/* isConst = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isPlatform = */ false,
/* isImpl = */ false /* isImpl = */ false,
/* isExternal = */ false
); );
propertyWrapper.setDescriptor(propertyDescriptor); propertyWrapper.setDescriptor(propertyDescriptor);
propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(), propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(),
@@ -148,7 +148,8 @@ class LocalVariableResolver(
/* lateInit = */ false, /* lateInit = */ false,
/* isConst = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isPlatform = */ false,
/* isImpl = */ false /* isImpl = */ false,
/* isExternal = */ false
) )
// For a local variable the type must not be deferred // For a local variable the type must not be deferred
type = variableTypeAndInitializerResolver.resolveType(propertyDescriptor, scope, variable, dataFlowInfo, trace, local = true) type = variableTypeAndInitializerResolver.resolveType(propertyDescriptor, scope, variable, dataFlowInfo, trace, local = true)
@@ -99,7 +99,8 @@ class DynamicCallableDescriptors(storageManager: StorageManager, builtIns: Kotli
/* lateInit = */ false, /* lateInit = */ false,
/* isConst = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isPlatform = */ false,
/* isImpl = */ false /* isImpl = */ false,
/* isExternal = */ false
) )
propertyDescriptor.setType( propertyDescriptor.setType(
dynamicType, dynamicType,
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.lazy.descriptors
import com.google.common.collect.Sets import com.google.common.collect.Sets
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
@@ -53,8 +54,10 @@ protected constructor(
return declarationProvider.getClassOrObjectDeclarations(name).map { return declarationProvider.getClassOrObjectDeclarations(name).map {
if (it is KtScriptInfo) if (it is KtScriptInfo)
LazyScriptDescriptor(c as ResolveSession, thisDescriptor, name, it) LazyScriptDescriptor(c as ResolveSession, thisDescriptor, name, it)
else else {
LazyClassDescriptor(c, thisDescriptor, name, it) val isExternal = it.modifierList?.hasModifier(KtTokens.EXTERNAL_KEYWORD) ?: false
LazyClassDescriptor(c, thisDescriptor, name, it, isExternal)
}
}.toReadOnlyList() }.toReadOnlyList()
} }
@@ -111,10 +111,12 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@NotNull final LazyClassContext c, @NotNull final LazyClassContext c,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull Name name, @NotNull Name name,
@NotNull final KtClassLikeInfo classLikeInfo @NotNull final KtClassLikeInfo classLikeInfo,
boolean isExternal
) { ) {
super(c.getStorageManager(), containingDeclaration, name, super(c.getStorageManager(), containingDeclaration, name,
KotlinSourceElementKt.toSourceElement(classLikeInfo.getCorrespondingClassOrObject()) KotlinSourceElementKt.toSourceElement(classLikeInfo.getCorrespondingClassOrObject()),
isExternal
); );
this.c = c; this.c = c;
@@ -43,7 +43,8 @@ class LazyScriptDescriptor(
resolveSession, resolveSession,
containingDeclaration, containingDeclaration,
name, name,
scriptInfo scriptInfo,
/* isExternal = */ false
) { ) {
init { init {
resolveSession.trace.record(BindingContext.SCRIPT, scriptInfo.script, this) resolveSession.trace.record(BindingContext.SCRIPT, scriptInfo.script, this)
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker
import org.jetbrains.kotlin.frontend.di.createContainerForLazyLocalClassifierAnalyzer import org.jetbrains.kotlin.frontend.di.createContainerForLazyLocalClassifierAnalyzer
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -152,7 +153,8 @@ class LocalClassDescriptorHolder(
, ,
containingDeclaration, containingDeclaration,
classOrObject.getNameAsSafeName(), classOrObject.getNameAsSafeName(),
KtClassInfoUtil.createClassLikeInfo(classOrObject) KtClassInfoUtil.createClassLikeInfo(classOrObject),
classOrObject.hasModifier(KtTokens.EXTERNAL_KEYWORD)
) )
writableScope?.addClassifierDescriptor(classDescriptor!!) writableScope?.addClassifierDescriptor(classDescriptor!!)
} }
@@ -33,4 +33,6 @@ class DefaultImplsClassDescriptorImpl(
init { init {
initialize(emptyList(), listOf(correspondingInterface.module.builtIns.anyType)) initialize(emptyList(), listOf(correspondingInterface.module.builtIns.anyType))
} }
override fun isExternal() = false
} }
@@ -37,4 +37,6 @@ class FileClassDescriptorImpl(
init { init {
initialize(emptyList(), supertypes) initialize(emptyList(), supertypes)
} }
override fun isExternal() = false
} }
@@ -44,7 +44,7 @@ class JvmPropertyDescriptorImpl(
isImpl: Boolean isImpl: Boolean
) : JvmDescriptorWithExtraFlags, PropertyDescriptorImpl( ) : JvmDescriptorWithExtraFlags, PropertyDescriptorImpl(
containingDeclaration, original, annotations, modality, visibility, isVar, containingDeclaration, original, annotations, modality, visibility, isVar,
name, kind, source, isLateInit, isConst, isPlatform, isImpl name, kind, source, isLateInit, isConst, isPlatform, isImpl, /* isExternal = */ false
) { ) {
override fun createSubstitutedCopy( override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
@@ -140,6 +140,7 @@ open class KnownClassDescriptor(
override fun isInner(): Boolean = false override fun isInner(): Boolean = false
override fun isPlatform(): Boolean = false override fun isPlatform(): Boolean = false
override fun isImpl(): Boolean = false override fun isImpl(): Boolean = false
override fun isExternal(): Boolean = false
override fun <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R { override fun <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R {
return visitor.visitClassDescriptor(this, data) return visitor.visitClassDescriptor(this, data)
@@ -59,7 +59,8 @@ class JvmSharedVariablesManager(val builtIns: KotlinBuiltIns) : SharedVariablesM
PropertyDescriptorImpl.create( PropertyDescriptorImpl.create(
refClass, Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, true, refClass, Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, true,
Name.identifier("element"), CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE, Name.identifier("element"), CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE,
false, false, false, false /* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false,
/* isExternal = */ false
).initialize(type, dispatchReceiverParameter = refClass.thisAsReceiverParameter) ).initialize(type, dispatchReceiverParameter = refClass.thisAsReceiverParameter)
} }
@@ -99,7 +100,8 @@ class JvmSharedVariablesManager(val builtIns: KotlinBuiltIns) : SharedVariablesM
PropertyDescriptorImpl.create( PropertyDescriptorImpl.create(
genericRefClass, Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, true, genericRefClass, Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, true,
Name.identifier("element"), CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE, Name.identifier("element"), CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE,
false, false, false, false /* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false,
/* isExternal = */ false
).initialize( ).initialize(
type = builtIns.anyType, type = builtIns.anyType,
dispatchReceiverParameter = genericRefClass.thisAsReceiverParameter dispatchReceiverParameter = genericRefClass.thisAsReceiverParameter
@@ -128,7 +128,8 @@ class SpecialDescriptorsFactory(
objectDescriptor, objectDescriptor,
Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, false, Annotations.EMPTY, Modality.FINAL, Visibilities.PUBLIC, false,
Name.identifier("INSTANCE"), Name.identifier("INSTANCE"),
CallableMemberDescriptor.Kind.SYNTHESIZED, SourceElement.NO_SOURCE, false, false, false, false CallableMemberDescriptor.Kind.SYNTHESIZED, SourceElement.NO_SOURCE, /* lateInit = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isImpl = */ false, /* isExternal = */ false
).initialize(objectDescriptor.defaultType) ).initialize(objectDescriptor.defaultType)
return instanceFieldDescriptor return instanceFieldDescriptor
@@ -61,7 +61,8 @@ abstract class IrDelegateDescriptorBase(
/* lateInit = */ false, /* lateInit = */ false,
/* isConst = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isPlatform = */ false,
/* isImpl = */ false /* isImpl = */ false,
/* isExternal = */ false
) { ) {
init { init {
setOutType(delegateType) setOutType(delegateType)
@@ -33,7 +33,7 @@ class JvmBuiltInClassDescriptorFactory(
ClassDescriptorImpl( ClassDescriptorImpl(
moduleDescriptor.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().first(), moduleDescriptor.getPackage(KOTLIN_FQ_NAME).fragments.filterIsInstance<BuiltInsPackageFragment>().first(),
CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType), CLONEABLE_NAME, Modality.ABSTRACT, ClassKind.INTERFACE, listOf(moduleDescriptor.builtIns.anyType),
SourceElement.NO_SOURCE SourceElement.NO_SOURCE, /* isExternal = */ false
).apply { ).apply {
initialize(CloneableClassScope(storageManager, this), emptySet(), null) initialize(CloneableClassScope(storageManager, this), emptySet(), null)
} }
@@ -46,7 +46,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
boolean isStaticFinal boolean isStaticFinal
) { ) {
super(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source, super(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source,
/* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false); /* lateInit = */ false, /* isConst = */ false, /* isPlatform = */ false, /* isImpl = */ false, /* isExternal = */ false);
this.isStaticFinal = isStaticFinal; this.isStaticFinal = isStaticFinal;
} }
@@ -55,7 +55,8 @@ class LazyJavaClassDescriptor(
private val jClass: JavaClass, private val jClass: JavaClass,
private val additionalSupertypeClassDescriptor: ClassDescriptor? = null private val additionalSupertypeClassDescriptor: ClassDescriptor? = null
) : ClassDescriptorBase(outerContext.storageManager, containingDeclaration, jClass.name, ) : ClassDescriptorBase(outerContext.storageManager, containingDeclaration, jClass.name,
outerContext.components.sourceElementFactory.source(jClass)), JavaClassDescriptor { outerContext.components.sourceElementFactory.source(jClass),
/* isExternal = */ false), JavaClassDescriptor {
private val c: LazyJavaResolverContext = outerContext.child(this, jClass) private val c: LazyJavaResolverContext = outerContext.child(this, jClass)
@@ -87,9 +87,9 @@ open class JvmBuiltInsSettings(
// - Otherwise error will be reported because of Deprecated annotation with Error level // - Otherwise error will be reported because of Deprecated annotation with Error level
val lowPriorityAnnotation = val lowPriorityAnnotation =
ClassDescriptorImpl( ClassDescriptorImpl(
moduleDescriptor.getPackage(LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_FQ_NAME.parent()), moduleDescriptor.getPackage(LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_FQ_NAME.parent()), LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_FQ_NAME.shortName(),
LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_FQ_NAME.shortName(), Modality.FINAL, ClassKind.ANNOTATION_CLASS, Modality.FINAL, ClassKind.ANNOTATION_CLASS, moduleDescriptor.builtIns.anyType.singletonList(),
moduleDescriptor.builtIns.anyType.singletonList(), SourceElement.NO_SOURCE SourceElement.NO_SOURCE, /* isExternal = */ false
).run { ).run {
initialize(MemberScope.Empty, emptySet(), null) initialize(MemberScope.Empty, emptySet(), null)
AnnotationDescriptorImpl(defaultType, emptyMap(), SourceElement.NO_SOURCE) AnnotationDescriptorImpl(defaultType, emptyMap(), SourceElement.NO_SOURCE)
@@ -112,7 +112,8 @@ open class JvmBuiltInsSettings(
val superTypes = listOf(LazyWrappedType(this) { moduleDescriptor.builtIns.anyType }) val superTypes = listOf(LazyWrappedType(this) { moduleDescriptor.builtIns.anyType })
val mockSerializableClass = ClassDescriptorImpl( val mockSerializableClass = ClassDescriptorImpl(
mockJavaIoPackageFragment, Name.identifier("Serializable"), Modality.ABSTRACT, ClassKind.INTERFACE, superTypes, SourceElement.NO_SOURCE mockJavaIoPackageFragment, Name.identifier("Serializable"), Modality.ABSTRACT, ClassKind.INTERFACE, superTypes,
SourceElement.NO_SOURCE, /* isExternal = */ false
) )
mockSerializableClass.initialize(MemberScope.Empty, emptySet(), null) mockSerializableClass.initialize(MemberScope.Empty, emptySet(), null)
@@ -104,6 +104,7 @@ class FunctionClassDescriptor(
override fun isData() = false override fun isData() = false
override fun isPlatform() = false override fun isPlatform() = false
override fun isImpl() = false override fun isImpl() = false
override fun isExternal() = false
override val annotations: Annotations get() = Annotations.EMPTY override val annotations: Annotations get() = Annotations.EMPTY
override fun getSource() = SourceElement.NO_SOURCE override fun getSource() = SourceElement.NO_SOURCE
@@ -75,8 +75,6 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
boolean isTailrec(); boolean isTailrec();
boolean isExternal();
boolean isHiddenForResolutionEverywhereBesideSupercalls(); boolean isHiddenForResolutionEverywhereBesideSupercalls();
boolean isSuspend(); boolean isSuspend();
@@ -29,4 +29,6 @@ public interface MemberDescriptor extends DeclarationDescriptorNonRoot, Declarat
boolean isPlatform(); boolean isPlatform();
boolean isImpl(); boolean isImpl();
boolean isExternal();
} }
@@ -69,6 +69,8 @@ abstract class AbstractTypeAliasDescriptor(
override fun isImpl(): Boolean = false override fun isImpl(): Boolean = false
override fun isExternal() = false
override fun getTypeConstructor(): TypeConstructor = override fun getTypeConstructor(): TypeConstructor =
typeConstructor typeConstructor
@@ -26,16 +26,24 @@ public abstract class ClassDescriptorBase extends AbstractClassDescriptor {
private final DeclarationDescriptor containingDeclaration; private final DeclarationDescriptor containingDeclaration;
private final SourceElement source; private final SourceElement source;
private final boolean isExternal;
protected ClassDescriptorBase( protected ClassDescriptorBase(
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull Name name, @NotNull Name name,
@NotNull SourceElement source @NotNull SourceElement source,
boolean isExternal
) { ) {
super(storageManager, name); super(storageManager, name);
this.containingDeclaration = containingDeclaration; this.containingDeclaration = containingDeclaration;
this.source = source; this.source = source;
this.isExternal = isExternal;
}
@Override
public boolean isExternal() {
return isExternal;
} }
@NotNull @NotNull
@@ -47,9 +47,10 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
@NotNull Modality modality, @NotNull Modality modality,
@NotNull ClassKind kind, @NotNull ClassKind kind,
@NotNull Collection<KotlinType> supertypes, @NotNull Collection<KotlinType> supertypes,
@NotNull SourceElement source @NotNull SourceElement source,
boolean isExternal
) { ) {
super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source); super(LockBasedStorageManager.NO_LOCKS, containingDeclaration, name, source, isExternal);
this.modality = modality; this.modality = modality;
this.kind = kind; this.kind = kind;
@@ -75,7 +75,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull Annotations annotations, @NotNull Annotations annotations,
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
super(storageManager, containingClass, name, source); super(storageManager, containingClass, name, source, /* isExternal = */ false);
assert containingClass.getKind() == ClassKind.ENUM_CLASS; assert containingClass.getKind() == ClassKind.ENUM_CLASS;
this.annotations = annotations; this.annotations = annotations;
@@ -216,6 +216,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.isData(); return original.isData();
} }
@Override
public boolean isExternal() {
return original.isExternal();
}
@Override @Override
public boolean isCompanionObject() { public boolean isCompanionObject() {
return original.isCompanionObject(); return original.isCompanionObject();
@@ -46,6 +46,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private final boolean isConst; private final boolean isConst;
private final boolean isPlatform; private final boolean isPlatform;
private final boolean isImpl; private final boolean isImpl;
private final boolean isExternal;
private ReceiverParameterDescriptor dispatchReceiverParameter; private ReceiverParameterDescriptor dispatchReceiverParameter;
private ReceiverParameterDescriptor extensionReceiverParameter; private ReceiverParameterDescriptor extensionReceiverParameter;
@@ -67,7 +68,8 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
boolean lateInit, boolean lateInit,
boolean isConst, boolean isConst,
boolean isPlatform, boolean isPlatform,
boolean isImpl boolean isImpl,
boolean isExternal
) { ) {
super(containingDeclaration, annotations, name, null, isVar, source); super(containingDeclaration, annotations, name, null, isVar, source);
this.modality = modality; this.modality = modality;
@@ -78,6 +80,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
this.isConst = isConst; this.isConst = isConst;
this.isPlatform = isPlatform; this.isPlatform = isPlatform;
this.isImpl = isImpl; this.isImpl = isImpl;
this.isExternal = isExternal;
} }
@NotNull @NotNull
@@ -93,10 +96,12 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
boolean lateInit, boolean lateInit,
boolean isConst, boolean isConst,
boolean isPlatform, boolean isPlatform,
boolean isImpl boolean isImpl,
boolean isExternal
) { ) {
return new PropertyDescriptorImpl(containingDeclaration, null, annotations, return new PropertyDescriptorImpl(containingDeclaration, null, annotations,
modality, visibility, isVar, name, kind, source, lateInit, isConst, isPlatform, isImpl); modality, visibility, isVar, name, kind, source, lateInit, isConst,
isPlatform, isImpl, isExternal);
} }
public void setType( public void setType(
@@ -199,6 +204,11 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return isConst; return isConst;
} }
@Override
public boolean isExternal() {
return isExternal;
}
@Override @Override
@NotNull @NotNull
public List<PropertyAccessorDescriptor> getAccessors() { public List<PropertyAccessorDescriptor> getAccessors() {
@@ -342,7 +352,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
) { ) {
return new PropertyDescriptorImpl( return new PropertyDescriptorImpl(
newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, SourceElement.NO_SOURCE, newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, SourceElement.NO_SOURCE,
isLateInit(), isConst(), isPlatform(), isImpl() isLateInit(), isConst(), isPlatform(), isImpl(), isExternal()
); );
} }
@@ -286,7 +286,9 @@ public class ErrorUtils {
private static class ErrorClassDescriptor extends ClassDescriptorImpl { private static class ErrorClassDescriptor extends ClassDescriptorImpl {
public ErrorClassDescriptor(@Nullable String name) { public ErrorClassDescriptor(@Nullable String name) {
super(getErrorModule(), Name.special(name == null ? "<ERROR CLASS>" : "<ERROR CLASS: " + name + ">"), super(getErrorModule(), Name.special(name == null ? "<ERROR CLASS>" : "<ERROR CLASS: " + name + ">"),
Modality.OPEN, ClassKind.CLASS, Collections.<KotlinType>emptyList(), SourceElement.NO_SOURCE); Modality.OPEN, ClassKind.CLASS, Collections.<KotlinType>emptyList(), SourceElement.NO_SOURCE,
/* isExternal = */ false
);
ClassConstructorDescriptorImpl ClassConstructorDescriptorImpl
errorConstructor = ClassConstructorDescriptorImpl.create(this, Annotations.Companion.getEMPTY(), true, SourceElement.NO_SOURCE); errorConstructor = ClassConstructorDescriptorImpl.create(this, Annotations.Companion.getEMPTY(), true, SourceElement.NO_SOURCE);
@@ -367,7 +369,8 @@ public class ErrorUtils {
/* lateInit = */ false, /* lateInit = */ false,
/* isConst = */ false, /* isConst = */ false,
/* isPlatform = */ false, /* isPlatform = */ false,
/* isImpl = */ false /* isImpl = */ false,
/* isExternal = */ false
); );
descriptor.setType(ERROR_PROPERTY_TYPE, descriptor.setType(ERROR_PROPERTY_TYPE,
Collections.<TypeParameterDescriptor>emptyList(), Collections.<TypeParameterDescriptor>emptyList(),
@@ -35,6 +35,7 @@ public class Flags {
public static final FlagField<ProtoBuf.Class.Kind> CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values()); public static final FlagField<ProtoBuf.Class.Kind> CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values());
public static final BooleanFlagField IS_INNER = FlagField.booleanAfter(CLASS_KIND); public static final BooleanFlagField IS_INNER = FlagField.booleanAfter(CLASS_KIND);
public static final BooleanFlagField IS_DATA = FlagField.booleanAfter(IS_INNER); public static final BooleanFlagField IS_DATA = FlagField.booleanAfter(IS_INNER);
public static final BooleanFlagField IS_EXTERNAL_CLASS = FlagField.booleanAfter(IS_DATA);
// Constructors // Constructors
@@ -61,6 +62,7 @@ public class Flags {
public static final BooleanFlagField IS_CONST = FlagField.booleanAfter(HAS_SETTER); public static final BooleanFlagField IS_CONST = FlagField.booleanAfter(HAS_SETTER);
public static final BooleanFlagField IS_LATEINIT = FlagField.booleanAfter(IS_CONST); public static final BooleanFlagField IS_LATEINIT = FlagField.booleanAfter(IS_CONST);
public static final BooleanFlagField HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT); public static final BooleanFlagField HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT);
public static final BooleanFlagField IS_EXTERNAL_PROPERTY = FlagField.booleanAfter(HAS_CONSTANT);
// Parameters // Parameters
@@ -46,6 +46,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
Deserialization.memberKind(Flags.MEMBER_KIND.get(flags)), Deserialization.memberKind(Flags.MEMBER_KIND.get(flags)),
Flags.IS_LATEINIT.get(flags), Flags.IS_LATEINIT.get(flags),
Flags.IS_CONST.get(flags), Flags.IS_CONST.get(flags),
Flags.IS_EXTERNAL_PROPERTY.get(flags),
proto, proto,
c.nameResolver, c.nameResolver,
c.typeTable, c.typeTable,
@@ -86,7 +86,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
name: Name, name: Name,
private val isInner: Boolean, private val isInner: Boolean,
numberOfDeclaredTypeParameters: Int numberOfDeclaredTypeParameters: Int
) : ClassDescriptorBase(storageManager, container, name, SourceElement.NO_SOURCE) { ) : ClassDescriptorBase(storageManager, container, name, SourceElement.NO_SOURCE, /* isExternal = */ false) {
private val typeParameters = createTypeParameters(this, numberOfDeclaredTypeParameters) private val typeParameters = createTypeParameters(this, numberOfDeclaredTypeParameters)
private val typeConstructor = ClassTypeConstructorImpl(this, /* isFinal = */ true, typeParameters, setOf(module.builtIns.anyType)) private val typeConstructor = ClassTypeConstructorImpl(this, /* isFinal = */ true, typeParameters, setOf(module.builtIns.anyType))
@@ -102,6 +102,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
override fun isData() = false override fun isData() = false
override fun isPlatform() = false override fun isPlatform() = false
override fun isImpl() = false override fun isImpl() = false
override fun isExternal() = false
override val annotations: Annotations get() = Annotations.EMPTY override val annotations: Annotations get() = Annotations.EMPTY
override fun getUnsubstitutedMemberScope() = MemberScope.Empty override fun getUnsubstitutedMemberScope() = MemberScope.Empty
@@ -99,6 +99,8 @@ class DeserializedClassDescriptor(
override fun isImpl() = false override fun isImpl() = false
override fun isExternal() = Flags.IS_EXTERNAL_CLASS.get(classProto.flags)
override fun getUnsubstitutedMemberScope(): MemberScope = memberScope override fun getUnsubstitutedMemberScope(): MemberScope = memberScope
override fun getStaticScope() = staticScope override fun getStaticScope() = staticScope
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.* import org.jetbrains.kotlin.descriptors.impl.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.deserialization.TypeTable import org.jetbrains.kotlin.serialization.deserialization.TypeTable
@@ -87,13 +88,15 @@ class DeserializedPropertyDescriptor(
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
isLateInit: Boolean, isLateInit: Boolean,
isConst: Boolean, isConst: Boolean,
isExternal: Boolean,
override val proto: ProtoBuf.Property, override val proto: ProtoBuf.Property,
override val nameResolver: NameResolver, override val nameResolver: NameResolver,
override val typeTable: TypeTable, override val typeTable: TypeTable,
override val containerSource: DeserializedContainerSource? override val containerSource: DeserializedContainerSource?
) : DeserializedCallableMemberDescriptor, ) : DeserializedCallableMemberDescriptor,
PropertyDescriptorImpl(containingDeclaration, original, annotations, PropertyDescriptorImpl(containingDeclaration, original, annotations,
modality, visibility, isVar, name, kind, SourceElement.NO_SOURCE, isLateInit, isConst, false, false) { modality, visibility, isVar, name, kind, SourceElement.NO_SOURCE, isLateInit, isConst, false, false,
isExternal) {
override fun createSubstitutedCopy( override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
@@ -103,10 +106,12 @@ class DeserializedPropertyDescriptor(
kind: CallableMemberDescriptor.Kind kind: CallableMemberDescriptor.Kind
): PropertyDescriptorImpl { ): PropertyDescriptorImpl {
return DeserializedPropertyDescriptor( return DeserializedPropertyDescriptor(
newOwner, original, annotations, newModality, newVisibility, isVar, name, kind, isLateInit, isConst, newOwner, original, annotations, newModality, newVisibility, isVar, name, kind, isLateInit, isConst, isExternal,
proto, nameResolver, typeTable, containerSource proto, nameResolver, typeTable, containerSource
) )
} }
override fun isExternal() = Flags.IS_EXTERNAL_PROPERTY.get(proto.flags)
} }
class DeserializedClassConstructorDescriptor( class DeserializedClassConstructorDescriptor(
@@ -101,7 +101,11 @@ private fun genProperty(
Name.identifier(id.name), Name.identifier(id.name),
CallableMemberDescriptor.Kind.SYNTHESIZED, CallableMemberDescriptor.Kind.SYNTHESIZED,
sourceElement, sourceElement,
false, false, false, false /* lateinit = */ false,
/* isConst = */ false,
/* isPlatform = */ false,
/* isImpl = */ false,
/* isExternal = */ false
) { ) {
override val errorType = errorType override val errorType = errorType
override val cacheView = cacheView override val cacheView = cacheView