Make PropertyAccessorDescriptor#hasBody a front-end utility

This commit is contained in:
Alexander Udalov
2016-02-22 19:48:59 +03:00
committed by Alexander Udalov
parent ae14d185eb
commit 4553afbd0c
15 changed files with 72 additions and 65 deletions
@@ -33,7 +33,7 @@ import java.util.Collections;
public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implements AccessorForCallableDescriptor<PropertyDescriptor> { public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implements AccessorForCallableDescriptor<PropertyDescriptor> {
private final PropertyDescriptor calleeDescriptor; private final PropertyDescriptor calleeDescriptor;
private final ClassDescriptor superCallTarget; private final ClassDescriptor superCallTarget;
@NotNull private final String nameSuffix; private final String nameSuffix;
private final boolean withSyntheticGetterAccessor; private final boolean withSyntheticGetterAccessor;
private final boolean withSyntheticSetterAccessor; private final boolean withSyntheticSetterAccessor;
@@ -95,9 +95,7 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implem
public static class Getter extends PropertyGetterDescriptorImpl implements AccessorForCallableDescriptor<PropertyGetterDescriptor> { public static class Getter extends PropertyGetterDescriptorImpl implements AccessorForCallableDescriptor<PropertyGetterDescriptor> {
public Getter(AccessorForPropertyDescriptor property) { public Getter(AccessorForPropertyDescriptor property) {
super(property, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL, super(property, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL,
false, false, /* isDefault = */ false, /* isExternal = */ false, Kind.DECLARATION, null, SourceElement.NO_SOURCE);
/* isExternal = */ false,
Kind.DECLARATION, null, SourceElement.NO_SOURCE);
initialize(property.getType()); initialize(property.getType());
} }
@@ -119,9 +117,7 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl implem
public static class Setter extends PropertySetterDescriptorImpl implements AccessorForCallableDescriptor<PropertySetterDescriptor>{ public static class Setter extends PropertySetterDescriptorImpl implements AccessorForCallableDescriptor<PropertySetterDescriptor>{
public Setter(AccessorForPropertyDescriptor property) { public Setter(AccessorForPropertyDescriptor property) {
super(property, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL, super(property, Annotations.Companion.getEMPTY(), Modality.FINAL, Visibilities.LOCAL,
false, false, /* isDefault = */ false, /* isExternal = */ false, Kind.DECLARATION, null, SourceElement.NO_SOURCE);
/* isExternal = */ false,
Kind.DECLARATION, null, SourceElement.NO_SOURCE);
initializeDefault(); initializeDefault();
} }
@@ -161,7 +161,7 @@ public class JvmCodegenUtil {
if (accessor == null) return true; if (accessor == null) return true;
// If the accessor is non-default (i.e. it has some code) we should call that accessor and not use direct access // If the accessor is non-default (i.e. it has some code) we should call that accessor and not use direct access
if (accessor.hasBody()) return false; if (DescriptorPsiUtilsKt.hasBody(accessor)) return false;
// If the accessor is private or final, it can't be overridden in the subclass and thus we can use direct access // If the accessor is private or final, it can't be overridden in the subclass and thus we can use direct access
return Visibilities.isPrivate(property.getVisibility()) || accessor.getModality() == FINAL; return Visibilities.isPrivate(property.getVisibility()) || accessor.getModality() == FINAL;
@@ -315,7 +315,6 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l
Modality.FINAL, Modality.FINAL,
visibility, visibility,
false, false,
false,
getMethod.isExternal, getMethod.isExternal,
CallableMemberDescriptor.Kind.SYNTHESIZED, CallableMemberDescriptor.Kind.SYNTHESIZED,
null, null,
@@ -328,7 +327,6 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l
Modality.FINAL, Modality.FINAL,
syntheticExtensionVisibility(setMethod), syntheticExtensionVisibility(setMethod),
false, false,
false,
setMethod.isExternal, setMethod.isExternal,
CallableMemberDescriptor.Kind.SYNTHESIZED, CallableMemberDescriptor.Kind.SYNTHESIZED,
null, null,
@@ -351,7 +349,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l
} }
override fun substitute(originalSubstitutor: TypeSubstitutor): PropertyDescriptor? { override fun substitute(originalSubstitutor: TypeSubstitutor): PropertyDescriptor? {
val descriptor = super<PropertyDescriptorImpl>.substitute(originalSubstitutor) as MyPropertyDescriptor val descriptor = super.substitute(originalSubstitutor) as MyPropertyDescriptor
if (descriptor == this) return descriptor if (descriptor == this) return descriptor
val classTypeParameters = (getMethod.containingDeclaration as ClassDescriptor).typeConstructor.parameters val classTypeParameters = (getMethod.containingDeclaration as ClassDescriptor).typeConstructor.parameters
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.psi.KtPropertyAccessor
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
fun PropertyAccessorDescriptor.hasBody(): Boolean {
val ktAccessor = DescriptorToSourceUtils.getSourceFromDescriptor(this) as? KtPropertyAccessor
return ktAccessor != null && ktAccessor.hasBody()
}
@@ -183,8 +183,8 @@ public interface BindingContext {
if (getter == null) return true; if (getter == null) return true;
if (propertyDescriptor.isVar() && setter == null) return true; if (propertyDescriptor.isVar() && setter == null) return true;
if (setter != null && !setter.hasBody() && setter.getModality() != Modality.ABSTRACT) return true; if (setter != null && !DescriptorPsiUtilsKt.hasBody(setter) && setter.getModality() != Modality.ABSTRACT) return true;
if (!getter.hasBody() && getter.getModality() != Modality.ABSTRACT) return true; if (!DescriptorPsiUtilsKt.hasBody(getter) && getter.getModality() != Modality.ABSTRACT) return true;
return backingFieldRequired; return backingFieldRequired;
} }
@@ -816,12 +816,13 @@ public class DescriptorResolver {
annotationResolver.resolveAnnotationsWithoutArguments(scopeWithTypeParameters, setter.getModifierList(), trace))); annotationResolver.resolveAnnotationsWithoutArguments(scopeWithTypeParameters, setter.getModifierList(), trace)));
KtParameter parameter = setter.getParameter(); KtParameter parameter = setter.getParameter();
setterDescriptor = new PropertySetterDescriptorImpl(propertyDescriptor, annotations, setterDescriptor = new PropertySetterDescriptorImpl(
resolveModalityFromModifiers(setter, propertyDescriptor.getModality()), propertyDescriptor, annotations,
resolveVisibilityFromModifiers(setter, propertyDescriptor.getVisibility()), resolveModalityFromModifiers(setter, propertyDescriptor.getModality()),
setter.hasBody(), false, setter.hasModifier(EXTERNAL_KEYWORD), resolveVisibilityFromModifiers(setter, propertyDescriptor.getVisibility()),
CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt /* isDefault = */ false, setter.hasModifier(EXTERNAL_KEYWORD),
.toSourceElement(setter)); CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt.toSourceElement(setter)
);
KtTypeReference returnTypeReference = setter.getReturnTypeReference(); KtTypeReference returnTypeReference = setter.getReturnTypeReference();
if (returnTypeReference != null) { if (returnTypeReference != null) {
KotlinType returnType = typeResolver.resolveType(scopeWithTypeParameters, returnTypeReference, trace, true); KotlinType returnType = typeResolver.resolveType(scopeWithTypeParameters, returnTypeReference, trace, true);
@@ -905,12 +906,13 @@ public class DescriptorResolver {
} }
} }
getterDescriptor = new PropertyGetterDescriptorImpl(propertyDescriptor, getterAnnotations, getterDescriptor = new PropertyGetterDescriptorImpl(
resolveModalityFromModifiers(getter, propertyDescriptor.getModality()), propertyDescriptor, getterAnnotations,
resolveVisibilityFromModifiers(getter, propertyDescriptor.getVisibility()), resolveModalityFromModifiers(getter, propertyDescriptor.getModality()),
getter.hasBody(), false, getter.hasModifier(EXTERNAL_KEYWORD), resolveVisibilityFromModifiers(getter, propertyDescriptor.getVisibility()),
CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt /* isDefault = */ false, getter.hasModifier(EXTERNAL_KEYWORD),
.toSourceElement(getter)); CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt.toSourceElement(getter)
);
if (returnType.isError() && !getter.hasBlockBody() && getter.hasBody()) { if (returnType.isError() && !getter.hasBlockBody() && getter.hasBody()) {
returnType = inferReturnTypeFromExpressionBody(storageManager, expressionTypingServices, trace, scopeWithTypeParameters, returnType = inferReturnTypeFromExpressionBody(storageManager, expressionTypingServices, trace, scopeWithTypeParameters,
DataFlowInfoFactory.EMPTY, getter, getterDescriptor); DataFlowInfoFactory.EMPTY, getter, getterDescriptor);
@@ -112,7 +112,8 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
if (getter != null) { if (getter != null) {
newGetter = new PropertyGetterDescriptorImpl( newGetter = new PropertyGetterDescriptorImpl(
enhanced, getter.getAnnotations(), getter.getModality(), getter.getVisibility(), enhanced, getter.getAnnotations(), getter.getModality(), getter.getVisibility(),
getter.hasBody(), getter.isDefault(), getter.isExternal(), getKind(), getter, getter.getSource()); getter.isDefault(), getter.isExternal(), getKind(), getter, getter.getSource()
);
newGetter.setInitialSignatureDescriptor(getter.getInitialSignatureDescriptor()); newGetter.setInitialSignatureDescriptor(getter.getInitialSignatureDescriptor());
newGetter.initialize(enhancedReturnType); newGetter.initialize(enhancedReturnType);
} }
@@ -122,7 +123,8 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
if (setter != null) { if (setter != null) {
newSetter = new PropertySetterDescriptorImpl( newSetter = new PropertySetterDescriptorImpl(
enhanced, setter.getAnnotations(), setter.getModality(), setter.getVisibility(), enhanced, setter.getAnnotations(), setter.getModality(), setter.getVisibility(),
setter.hasBody(), setter.isDefault(), setter.isExternal(), getKind(), setter, setter.getSource()); setter.isDefault(), setter.isExternal(), getKind(), setter, setter.getSource()
);
newSetter.setInitialSignatureDescriptor(newSetter.getInitialSignatureDescriptor()); newSetter.setInitialSignatureDescriptor(newSetter.getInitialSignatureDescriptor());
newSetter.initialize(setter.getValueParameters().get(0)); newSetter.initialize(setter.getValueParameters().get(0));
} }
@@ -21,8 +21,6 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
public interface PropertyAccessorDescriptor extends FunctionDescriptor { public interface PropertyAccessorDescriptor extends FunctionDescriptor {
boolean hasBody();
boolean isDefault(); boolean isDefault();
@NotNull @NotNull
@@ -45,6 +43,4 @@ public interface PropertyAccessorDescriptor extends FunctionDescriptor {
Kind kind, Kind kind,
boolean copyOverrides boolean copyOverrides
); );
boolean isExternal();
} }
@@ -29,8 +29,6 @@ import java.util.Collections;
import java.util.List; import java.util.List;
public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescriptorNonRootImpl implements PropertyAccessorDescriptor { public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescriptorNonRootImpl implements PropertyAccessorDescriptor {
private final boolean hasBody;
private final boolean isDefault; private final boolean isDefault;
private final boolean isExternal; private final boolean isExternal;
private final Modality modality; private final Modality modality;
@@ -46,7 +44,6 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
@NotNull PropertyDescriptor correspondingProperty, @NotNull PropertyDescriptor correspondingProperty,
@NotNull Annotations annotations, @NotNull Annotations annotations,
@NotNull Name name, @NotNull Name name,
boolean hasBody,
boolean isDefault, boolean isDefault,
boolean isExternal, boolean isExternal,
Kind kind, Kind kind,
@@ -56,17 +53,11 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
this.modality = modality; this.modality = modality;
this.visibility = visibility; this.visibility = visibility;
this.correspondingProperty = correspondingProperty; this.correspondingProperty = correspondingProperty;
this.hasBody = hasBody;
this.isDefault = isDefault; this.isDefault = isDefault;
this.isExternal = isExternal; this.isExternal = isExternal;
this.kind = kind; this.kind = kind;
} }
@Override
public boolean hasBody() {
return hasBody;
}
@Override @Override
public boolean isDefault() { public boolean isDefault() {
return isDefault; return isDefault;
@@ -260,7 +260,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
PropertyGetterDescriptorImpl newGetter = getter == null ? null : new PropertyGetterDescriptorImpl( PropertyGetterDescriptorImpl newGetter = getter == null ? null : new PropertyGetterDescriptorImpl(
substitutedDescriptor, getter.getAnnotations(), newModality, getter.getVisibility(), substitutedDescriptor, getter.getAnnotations(), newModality, getter.getVisibility(),
getter.hasBody(), getter.isDefault(), getter.isExternal(), kind, original == null ? null : original.getGetter(), getter.isDefault(), getter.isExternal(), kind, original == null ? null : original.getGetter(),
SourceElement.NO_SOURCE SourceElement.NO_SOURCE
); );
if (newGetter != null) { if (newGetter != null) {
@@ -270,7 +270,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
} }
PropertySetterDescriptorImpl newSetter = setter == null ? null : new PropertySetterDescriptorImpl( PropertySetterDescriptorImpl newSetter = setter == null ? null : new PropertySetterDescriptorImpl(
substitutedDescriptor, setter.getAnnotations(), newModality, setter.getVisibility(), substitutedDescriptor, setter.getAnnotations(), newModality, setter.getVisibility(),
setter.hasBody(), setter.isDefault(), setter.isExternal(), kind, original == null ? null : original.getSetter(), setter.isDefault(), setter.isExternal(), kind, original == null ? null : original.getSetter(),
SourceElement.NO_SOURCE SourceElement.NO_SOURCE
); );
if (newSetter != null) { if (newSetter != null) {
@@ -38,16 +38,14 @@ public class PropertyGetterDescriptorImpl extends PropertyAccessorDescriptorImpl
@NotNull Annotations annotations, @NotNull Annotations annotations,
@NotNull Modality modality, @NotNull Modality modality,
@NotNull Visibility visibility, @NotNull Visibility visibility,
boolean hasBody,
boolean isDefault, boolean isDefault,
boolean isExternal, boolean isExternal,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable PropertyGetterDescriptor original, @Nullable PropertyGetterDescriptor original,
@NotNull SourceElement source @NotNull SourceElement source
) ) {
{
super(modality, visibility, correspondingProperty, annotations, Name.special("<get-" + correspondingProperty.getName() + ">"), super(modality, visibility, correspondingProperty, annotations, Name.special("<get-" + correspondingProperty.getName() + ">"),
hasBody, isDefault, isExternal, kind, source); isDefault, isExternal, kind, source);
this.original = original != null ? original : this; this.original = original != null ? original : this;
} }
@@ -30,8 +30,8 @@ import java.util.List;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns;
public class PropertySetterDescriptorImpl extends PropertyAccessorDescriptorImpl implements PropertySetterDescriptor { public class PropertySetterDescriptorImpl extends PropertyAccessorDescriptorImpl implements PropertySetterDescriptor {
private ValueParameterDescriptor parameter; private ValueParameterDescriptor parameter;
@NotNull @NotNull
private final PropertySetterDescriptor original; private final PropertySetterDescriptor original;
@@ -40,7 +40,6 @@ public class PropertySetterDescriptorImpl extends PropertyAccessorDescriptorImpl
@NotNull Annotations annotations, @NotNull Annotations annotations,
@NotNull Modality modality, @NotNull Modality modality,
@NotNull Visibility visibility, @NotNull Visibility visibility,
boolean hasBody,
boolean isDefault, boolean isDefault,
boolean isExternal, boolean isExternal,
@NotNull Kind kind, @NotNull Kind kind,
@@ -48,7 +47,7 @@ public class PropertySetterDescriptorImpl extends PropertyAccessorDescriptorImpl
@NotNull SourceElement source @NotNull SourceElement source
) { ) {
super(modality, visibility, correspondingProperty, annotations, Name.special("<set-" + correspondingProperty.getName() + ">"), super(modality, visibility, correspondingProperty, annotations, Name.special("<set-" + correspondingProperty.getName() + ">"),
hasBody, isDefault, isExternal, kind, source); isDefault, isExternal, kind, source);
this.original = original != null ? original : this; this.original = original != null ? original : this;
} }
@@ -71,10 +71,10 @@ public class DescriptorFactory {
@NotNull Visibility visibility, @NotNull Visibility visibility,
@NotNull SourceElement sourceElement @NotNull SourceElement sourceElement
) { ) {
PropertySetterDescriptorImpl setterDescriptor = PropertySetterDescriptorImpl setterDescriptor = new PropertySetterDescriptorImpl(
new PropertySetterDescriptorImpl(propertyDescriptor, annotations, propertyDescriptor.getModality(), propertyDescriptor, annotations, propertyDescriptor.getModality(), visibility, isDefault, isExternal,
visibility, !isDefault, isDefault, isExternal, CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement
CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement); );
setterDescriptor.initializeDefault(); setterDescriptor.initializeDefault();
return setterDescriptor; return setterDescriptor;
} }
@@ -103,10 +103,12 @@ public class DescriptorFactory {
@NotNull Annotations annotations, @NotNull Annotations annotations,
boolean isDefault, boolean isDefault,
boolean isExternal, boolean isExternal,
@NotNull SourceElement sourceElement) { @NotNull SourceElement sourceElement
return new PropertyGetterDescriptorImpl(propertyDescriptor, annotations, propertyDescriptor.getModality(), ) {
propertyDescriptor.getVisibility(), !isDefault, isDefault, isExternal, return new PropertyGetterDescriptorImpl(
CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement); propertyDescriptor, annotations, propertyDescriptor.getModality(), propertyDescriptor.getVisibility(),
isDefault, isExternal, CallableMemberDescriptor.Kind.DECLARATION, null, sourceElement
);
} }
@NotNull @NotNull
@@ -40,7 +40,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
Deserialization.modality(Flags.MODALITY.get(flags)), Deserialization.modality(Flags.MODALITY.get(flags)),
Deserialization.visibility(Flags.VISIBILITY.get(flags)), Deserialization.visibility(Flags.VISIBILITY.get(flags)),
Flags.IS_VAR.get(flags), Flags.IS_VAR.get(flags),
c.nameResolver.getName(proto.getName()), c.nameResolver.getName(proto.name),
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),
@@ -75,16 +75,15 @@ class MemberDeserializer(private val c: DeserializationContext) {
getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER), getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER),
Deserialization.modality(Flags.MODALITY.get(getterFlags)), Deserialization.modality(Flags.MODALITY.get(getterFlags)),
Deserialization.visibility(Flags.VISIBILITY.get(getterFlags)), Deserialization.visibility(Flags.VISIBILITY.get(getterFlags)),
/* hasBody = */ isNotDefault,
/* isDefault = */ !isNotDefault, /* isDefault = */ !isNotDefault,
/* isExternal = */ isExternal, /* isExternal = */ isExternal,
property.getKind(), null, SourceElement.NO_SOURCE property.kind, null, SourceElement.NO_SOURCE
) )
} }
else { else {
DescriptorFactory.createDefaultGetter(property, Annotations.EMPTY) DescriptorFactory.createDefaultGetter(property, Annotations.EMPTY)
} }
getter.initialize(property.getReturnType()) getter.initialize(property.returnType)
getter getter
} }
else { else {
@@ -101,10 +100,9 @@ class MemberDeserializer(private val c: DeserializationContext) {
getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER), getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER),
Deserialization.modality(Flags.MODALITY.get(setterFlags)), Deserialization.modality(Flags.MODALITY.get(setterFlags)),
Deserialization.visibility(Flags.VISIBILITY.get(setterFlags)), Deserialization.visibility(Flags.VISIBILITY.get(setterFlags)),
/* hasBody = */ isNotDefault,
/* isDefault = */ !isNotDefault, /* isDefault = */ !isNotDefault,
/* isExternal = */ isExternal, /* isExternal = */ isExternal,
property.getKind(), null, SourceElement.NO_SOURCE property.kind, null, SourceElement.NO_SOURCE
) )
val setterLocal = local.childContext(setter, listOf()) val setterLocal = local.childContext(setter, listOf())
val valueParameters = setterLocal.memberDeserializer.valueParameters( val valueParameters = setterLocal.memberDeserializer.valueParameters(
@@ -122,10 +122,10 @@ private fun genProperty(
Visibilities.PUBLIC, Visibilities.PUBLIC,
false, false,
false, false,
false,
CallableMemberDescriptor.Kind.SYNTHESIZED, CallableMemberDescriptor.Kind.SYNTHESIZED,
null, null,
SourceElement.NO_SOURCE) SourceElement.NO_SOURCE
)
getter.initialize(null) getter.initialize(null)