Simplify if (..==null) {return null}

This commit is contained in:
Natalia Ukhorskaya
2013-11-18 15:03:55 +04:00
parent 06cb48e300
commit cbe04a6adf
@@ -109,27 +109,19 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
override fun visitBinaryExpression(expression: JetBinaryExpression, expectedType: JetType?): CompileTimeConstant<*>? { override fun visitBinaryExpression(expression: JetBinaryExpression, expectedType: JetType?): CompileTimeConstant<*>? {
val leftExpression = expression.getLeft() val leftExpression = expression.getLeft()
if (leftExpression == null) { if (leftExpression == null) return null
return null
}
val operationToken = expression.getOperationToken() val operationToken = expression.getOperationToken()
if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) { if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) {
val booleanType = KotlinBuiltIns.getInstance().getBooleanType() val booleanType = KotlinBuiltIns.getInstance().getBooleanType()
val leftConstant = evaluate(leftExpression, booleanType) val leftConstant = evaluate(leftExpression, booleanType)
if (leftConstant == null) { if (leftConstant == null) return null
return null
}
val rightExpression = expression.getRight() val rightExpression = expression.getRight()
if (rightExpression == null) { if (rightExpression == null) return null
return null
}
val rightConstant = evaluate(rightExpression, booleanType) val rightConstant = evaluate(rightExpression, booleanType)
if (rightConstant == null) { if (rightConstant == null) return null
return null
}
val operationName = when(operationToken) { val operationName = when(operationToken) {
JetTokens.ANDAND -> Name.identifier("&&") JetTokens.ANDAND -> Name.identifier("&&")
@@ -151,36 +143,30 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
private fun evaluateCall(callExpression: JetExpression, receiverExpression: JetExpression): Any? { private fun evaluateCall(callExpression: JetExpression, receiverExpression: JetExpression): Any? {
val resolvedCall = trace.getBindingContext().get(BindingContext.RESOLVED_CALL, callExpression) val resolvedCall = trace.getBindingContext().get(BindingContext.RESOLVED_CALL, callExpression)
if (resolvedCall != null) { if (resolvedCall == null) return null
val resultingDescriptor = resolvedCall.getResultingDescriptor()
// TODO getResultingDescriptor has NotNull annotation
if (resultingDescriptor == null) {
return null
}
val receiverExpressionType = getReceiverExpressionType(resolvedCall)
if (receiverExpressionType == null) {
return null
}
val receiverValue = evaluate(receiverExpression, receiverExpressionType) val resultingDescriptor = resolvedCall.getResultingDescriptor()
if (receiverValue == null) { if (resultingDescriptor == null) return null
return null
}
val arguments = resolvedCall.getValueArguments().entrySet().flatMap { val receiverExpressionType = getReceiverExpressionType(resolvedCall)
entry -> val (parameter, argument) = entry if (receiverExpressionType == null) return null
resolveArguments(argument.getArguments(), parameter.getType())
}
val resultingDescriptorName = resultingDescriptor.getName() val receiverValue = evaluate(receiverExpression, receiverExpressionType)
if (arguments.isEmpty()) { if (receiverValue == null) return null
return evaluateUnaryExpression(receiverValue, resultingDescriptorName)
} val arguments = resolvedCall.getValueArguments().entrySet().flatMap {
else if (arguments.size() == 1) { entry ->
return evaluateBinaryExpression(receiverValue, arguments.first!!, resultingDescriptorName) val (parameter, argument) = entry
} resolveArguments(argument.getArguments(), parameter.getType())
} }
val resultingDescriptorName = resultingDescriptor.getName()
if (arguments.isEmpty()) {
return evaluateUnaryExpression(receiverValue, resultingDescriptorName)
}
else if (arguments.size() == 1) {
return evaluateBinaryExpression(receiverValue, arguments.first(), resultingDescriptorName)
}
return null return null
} }
@@ -210,9 +196,9 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
return null return null
} }
/* 1.toInt(); 1.plus(1); MyEnum.A */
override fun visitQualifiedExpression(expression: JetQualifiedExpression, expectedType: JetType?): CompileTimeConstant<*>? { override fun visitQualifiedExpression(expression: JetQualifiedExpression, expectedType: JetType?): CompileTimeConstant<*>? {
val selectorExpression = expression.getSelectorExpression() val selectorExpression = expression.getSelectorExpression()
// 1.toInt(); 1.plus(1);
if (selectorExpression is JetCallExpression) { if (selectorExpression is JetCallExpression) {
val calleeExpression = selectorExpression.getCalleeExpression() val calleeExpression = selectorExpression.getCalleeExpression()
if (calleeExpression !is JetSimpleNameExpression) { if (calleeExpression !is JetSimpleNameExpression) {
@@ -224,7 +210,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
return createCompileTimeConstant(result, expectedType) return createCompileTimeConstant(result, expectedType)
} }
// TODO // Mynum.A
if (selectorExpression != null) { if (selectorExpression != null) {
return evaluate(selectorExpression, expectedType) return evaluate(selectorExpression, expectedType)
} }
@@ -234,37 +220,35 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
override fun visitCallExpression(expression: JetCallExpression, expectedType: JetType?): CompileTimeConstant<*>? { override fun visitCallExpression(expression: JetCallExpression, expectedType: JetType?): CompileTimeConstant<*>? {
val call = trace.getBindingContext().get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression()) val call = trace.getBindingContext().get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression())
if (call != null) { if (call == null) return null
val resultingDescriptor = call.getResultingDescriptor()
if (resultingDescriptor != null) {
if (AnnotationUtils.isArrayMethodCall(call)) {
val varargType = resultingDescriptor.getValueParameters().first?.getVarargElementType()!!
//todo flatmap val resultingDescriptor = call.getResultingDescriptor()
val arguments = arrayListOf<CompileTimeConstant<*>>() if (resultingDescriptor == null) return null
for (descriptorToArgument in call.getValueArguments().values()) {
arguments.addAll(resolveArguments(descriptorToArgument.getArguments(), varargType))
}
return ArrayValue(arguments, resultingDescriptor.getReturnType()!!)
}
// Ann() // array()
if (resultingDescriptor is ConstructorDescriptor) { if (AnnotationUtils.isArrayMethodCall(call)) {
val constructorReturnType = resultingDescriptor.getReturnType() val varargType = resultingDescriptor.getValueParameters().first?.getVarargElementType()!!
if (DescriptorUtils.isAnnotationClass(resultingDescriptor.getContainingDeclaration())) {
val descriptor = AnnotationDescriptorImpl()
descriptor.setAnnotationType(constructorReturnType)
AnnotationResolver.resolveAnnotationArgument(descriptor, call, trace)
return AnnotationValue(descriptor)
}
}
if (AnnotationUtils.isJavaClassMethodCall(call)) { val arguments = call.getValueArguments().values().flatMap { resolveArguments(it.getArguments(), varargType) }
return JavaClassValue(resultingDescriptor.getReturnType()) return ArrayValue(arguments, resultingDescriptor.getReturnType()!!)
} }
// Ann()
if (resultingDescriptor is ConstructorDescriptor) {
val classDescriptor: ClassDescriptor = resultingDescriptor.getContainingDeclaration()
if (DescriptorUtils.isAnnotationClass(classDescriptor)) {
val descriptor = AnnotationDescriptorImpl()
descriptor.setAnnotationType(classDescriptor.getDefaultType())
AnnotationResolver.resolveAnnotationArgument(descriptor, call, trace)
return AnnotationValue(descriptor)
} }
} }
// javaClass()
if (AnnotationUtils.isJavaClassMethodCall(call)) {
return JavaClassValue(resultingDescriptor.getReturnType())
}
return null return null
} }