Code clean

This commit is contained in:
Mikhael Bogdanov
2016-06-23 15:38:21 +03:00
parent 853c4d4453
commit 93a770fcc8
7 changed files with 27 additions and 34 deletions
@@ -2330,11 +2330,11 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
return lookupCapturedValueInConstructorParameters(descriptor); return lookupCapturedValueInConstructorParameters(descriptor);
} }
return lookupInContext(descriptor, StackValue.LOCAL_0, state, false, context, this); return lookupValuaAndLocalVariableMetadata(descriptor, StackValue.LOCAL_0, state, false, context, this);
} }
@Nullable @Nullable
static StackValue lookupInContext( static StackValue lookupValuaAndLocalVariableMetadata(
@NotNull DeclarationDescriptor descriptor, @NotNull DeclarationDescriptor descriptor,
@NotNull StackValue prefix, @NotNull StackValue prefix,
@NotNull GenerationState state, @NotNull GenerationState state,
@@ -2353,7 +2353,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
assert metadataValue != null : "Metadata stack value should be non-null for local delegated property"; assert metadataValue != null : "Metadata stack value should be non-null for local delegated property";
//required for ImplementationBodyCodegen.lookupConstructorExpressionsInClosureIfPresent //required for ImplementationBodyCodegen.lookupConstructorExpressionsInClosureIfPresent
if (codegen == null) return null; if (codegen == null) return null;
return codegen.delegatedVariableValue(value, metadataValue, (VariableDescriptorWithAccessors) descriptor, state.getBindingContext(), return codegen.delegatedVariableValue(value, metadataValue, (VariableDescriptorWithAccessors) descriptor,
state.getTypeMapper()); state.getTypeMapper());
} }
@@ -3780,7 +3780,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
VariableDescriptorWithAccessors variableDescriptor = (VariableDescriptorWithAccessors) descriptor; VariableDescriptorWithAccessors variableDescriptor = (VariableDescriptorWithAccessors) descriptor;
StackValue metadataValue = getVariableMetadataValue(variableDescriptor); StackValue metadataValue = getVariableMetadataValue(variableDescriptor);
return delegatedVariableValue(varValue, metadataValue, variableDescriptor, bindingContext, typeMapper); return delegatedVariableValue(varValue, metadataValue, variableDescriptor, typeMapper);
} }
private void initializeLocalVariable( private void initializeLocalVariable(
@@ -4488,7 +4488,6 @@ The "returned" value of try expression with no finally is either the last expres
@NotNull StackValue delegateValue, @NotNull StackValue delegateValue,
@NotNull StackValue metadataValue, @NotNull StackValue metadataValue,
@NotNull VariableDescriptorWithAccessors variableDescriptor, @NotNull VariableDescriptorWithAccessors variableDescriptor,
@NotNull BindingContext bindingContext,
@NotNull KotlinTypeMapper typeMapper @NotNull KotlinTypeMapper typeMapper
) { ) {
return StackValue.delegate(typeMapper.mapType(variableDescriptor.getType()), delegateValue, metadataValue, variableDescriptor, this); return StackValue.delegate(typeMapper.mapType(variableDescriptor.getType()), delegateValue, metadataValue, variableDescriptor, this);
@@ -1256,7 +1256,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private void lookupInContext(@NotNull DeclarationDescriptor toLookup) { private void lookupInContext(@NotNull DeclarationDescriptor toLookup) {
ExpressionCodegen.lookupInContext(toLookup, StackValue.LOCAL_0, state, true, context, null); ExpressionCodegen.lookupValuaAndLocalVariableMetadata(toLookup, StackValue.LOCAL_0, state, true, context, null);
} }
@Override @Override
@@ -1208,16 +1208,17 @@ public abstract class StackValue {
coerceTo(type, v); coerceTo(type, v);
} }
else { else {
PropertyGetterDescriptor getter = descriptor.getGetter(); PropertyGetterDescriptor getterDescriptor = descriptor.getGetter();
assert getter != null : "Getter descriptor should be not null for " + descriptor; assert getterDescriptor != null : "Getter descriptor should be not null for " + descriptor;
if (resolvedCall != null && getter.isInline()) { if (resolvedCall != null && getterDescriptor.isInline()) {
CallGenerator callGenerator = codegen.getOrCreateCallGenerator(resolvedCall, getter); CallGenerator callGenerator = codegen.getOrCreateCallGenerator(resolvedCall, getterDescriptor);
callGenerator.putHiddenParams(); callGenerator.putHiddenParams();
callGenerator.genCall(this.getter, resolvedCall, false, codegen); callGenerator.genCall(getter, resolvedCall, false, codegen);
} else {
this.getter.genInvokeInstruction(v);
} }
coerce(this.getter.getReturnType(), type, v); else {
getter.genInvokeInstruction(v);
}
coerce(getter.getReturnType(), type, v);
KotlinType returnType = descriptor.getReturnType(); KotlinType returnType = descriptor.getReturnType();
if (returnType != null && KotlinBuiltIns.isNothing(returnType)) { if (returnType != null && KotlinBuiltIns.isNothing(returnType)) {
@@ -1261,17 +1262,18 @@ public abstract class StackValue {
@Override @Override
public void store(@NotNull StackValue rightSide, @NotNull InstructionAdapter v, boolean skipReceiver) { public void store(@NotNull StackValue rightSide, @NotNull InstructionAdapter v, boolean skipReceiver) {
PropertySetterDescriptor setter = descriptor.getSetter(); PropertySetterDescriptor setterDescriptor = descriptor.getSetter();
if (resolvedCall != null && setter != null && setter.isInline()) { if (resolvedCall != null && setterDescriptor != null && setterDescriptor.isInline()) {
assert this.setter != null : "Setter descriptor should be not null for " + descriptor; assert setter != null : "Setter should be not null for " + descriptor;
CallGenerator callGenerator = codegen.getOrCreateCallGenerator(resolvedCall, setter); CallGenerator callGenerator = codegen.getOrCreateCallGenerator(resolvedCall, setterDescriptor);
if (!skipReceiver) { if (!skipReceiver) {
putReceiver(v, false); putReceiver(v, false);
} }
callGenerator.putHiddenParams(); callGenerator.putHiddenParams();
callGenerator.putValueIfNeeded(rightSide.type, rightSide); callGenerator.putValueIfNeeded(rightSide.type, rightSide);
callGenerator.genCall(this.setter, resolvedCall, false, codegen); callGenerator.genCall(setter, resolvedCall, false, codegen);
} else { }
else {
super.store(rightSide, v, skipReceiver); super.store(rightSide, v, skipReceiver);
} }
} }
@@ -233,7 +233,8 @@ class ReifiedTypeParameterAnnotationChecker : SimpleDeclarationChecker {
diagnosticHolder: DiagnosticSink, diagnosticHolder: DiagnosticSink,
bindingContext: BindingContext bindingContext: BindingContext
) { ) {
if (descriptor is CallableDescriptor && !InlineUtil.isInlineFunctionOrProperty(descriptor)) { if (descriptor is CallableDescriptor &&
!(InlineUtil.isInline(descriptor) || InlineUtil.isPropertyWithAllAccessorsAreInline(descriptor))) {
checkTypeParameterDescriptorsAreNotReified(descriptor.typeParameters, diagnosticHolder) checkTypeParameterDescriptorsAreNotReified(descriptor.typeParameters, diagnosticHolder)
} }
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.resolve; package org.jetbrains.kotlin.resolve;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.psi.KtCallableDeclaration; import org.jetbrains.kotlin.psi.KtCallableDeclaration;
import org.jetbrains.kotlin.psi.KtNamedFunction; import org.jetbrains.kotlin.psi.KtNamedFunction;
import org.jetbrains.kotlin.psi.KtProperty; import org.jetbrains.kotlin.psi.KtProperty;
@@ -29,8 +29,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
object InlineAnalyzerExtension : AnalyzerExtensions.AnalyzerExtension { object InlineAnalyzerExtension : AnalyzerExtensions.AnalyzerExtension {
override fun process(descriptor: CallableMemberDescriptor, functionOrProperty: KtCallableDeclaration, trace: BindingTrace) { override fun process(descriptor: CallableMemberDescriptor, functionOrProperty: KtCallableDeclaration, trace: BindingTrace) {
assert(InlineUtil.isInline(descriptor)) { "This method should be invoked on inline function: " + descriptor }
checkModalityAndOverrides(descriptor, functionOrProperty, trace) checkModalityAndOverrides(descriptor, functionOrProperty, trace)
notSupportedInInlineCheck(descriptor, functionOrProperty, trace) notSupportedInInlineCheck(descriptor, functionOrProperty, trace)
@@ -49,7 +47,7 @@ object InlineAnalyzerExtension : AnalyzerExtensions.AnalyzerExtension {
"Property descriptor $descriptor should have corresponded KtProperty, but has $functionOrProperty" "Property descriptor $descriptor should have corresponded KtProperty, but has $functionOrProperty"
} }
val hasBackingField = java.lang.Boolean.TRUE.equals(trace.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor as PropertyDescriptor)) val hasBackingField = trace.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor as PropertyDescriptor) == true
if (hasBackingField || (functionOrProperty as KtProperty).delegateExpression != null) { if (hasBackingField || (functionOrProperty as KtProperty).delegateExpression != null) {
trace.report(Errors.INLINE_PROPERTY_WITH_BACKING_FIELD.on(functionOrProperty)) trace.report(Errors.INLINE_PROPERTY_WITH_BACKING_FIELD.on(functionOrProperty))
} }
@@ -39,21 +39,17 @@ public class InlineUtil {
FunctionTypesKt.isFunctionType(valueParameterOrReceiver.getOriginal().getType()); FunctionTypesKt.isFunctionType(valueParameterOrReceiver.getOriginal().getType());
} }
public static boolean isInlineFunctionOrProperty(@Nullable DeclarationDescriptor descriptor) {
return isInline(descriptor) || isInlineProperty(descriptor);
}
public static boolean isInline(@Nullable DeclarationDescriptor descriptor) { public static boolean isInline(@Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof FunctionDescriptor && getInlineStrategy((FunctionDescriptor) descriptor).isInline(); return descriptor instanceof FunctionDescriptor && getInlineStrategy((FunctionDescriptor) descriptor).isInline();
} }
public static boolean hasInlineAccessors(@Nullable PropertyDescriptor propertyDescriptor) { public static boolean hasInlineAccessors(@NotNull PropertyDescriptor propertyDescriptor) {
PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); PropertyGetterDescriptor getter = propertyDescriptor.getGetter();
PropertySetterDescriptor setter = propertyDescriptor.getSetter(); PropertySetterDescriptor setter = propertyDescriptor.getSetter();
return getter != null && getter.isInline() || setter != null && setter.isInline(); return getter != null && getter.isInline() || setter != null && setter.isInline();
} }
public static boolean isInlineProperty(@Nullable DeclarationDescriptor descriptor) { public static boolean isPropertyWithAllAccessorsAreInline(@NotNull DeclarationDescriptor descriptor) {
if (!(descriptor instanceof PropertyDescriptor)) return false; if (!(descriptor instanceof PropertyDescriptor)) return false;
PropertyGetterDescriptor getter = ((PropertyDescriptor) descriptor).getGetter(); PropertyGetterDescriptor getter = ((PropertyDescriptor) descriptor).getGetter();