From 0b9c9a60474d4107d3cf1c5081341a6745cc60ee Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 13 Oct 2015 18:09:11 +0300 Subject: [PATCH] Support builtin properties in ConstantExpressionEvaluator --- .../evaluate/ConstantExpressionEvaluator.kt | 5 +++++ .../constants/evaluate/OperationsMapGenerated.kt | 1 + compiler/testData/evaluate/constant/strings.kt | 2 +- .../generators/evaluate/GenerateOperationsMap.kt | 14 ++++++++------ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index 5cae1a6237d..6838be43dae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -565,6 +565,11 @@ private class ConstantExpressionEvaluatorVisitor( return evaluateCall(calleeExpression, receiverExpression, expectedType) } + if (selectorExpression is JetSimpleNameExpression) { + val result = evaluateCall(selectorExpression, expression.receiverExpression, expectedType) + if (result != null) return result + } + // MyEnum.A, Integer.MAX_VALUE if (selectorExpression != null) { return evaluate(selectorExpression, expectedType) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/OperationsMapGenerated.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/OperationsMapGenerated.kt index 001de35eb6b..b1b585f14a2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/OperationsMapGenerated.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/OperationsMapGenerated.kt @@ -98,6 +98,7 @@ internal val unaryOperations: HashMap, Pair a.toLong() }, emptyUnaryFun), unaryOperation(SHORT, "toShort", { a -> a.toShort() }, emptyUnaryFun), unaryOperation(SHORT, "toString", { a -> a.toString() }, emptyUnaryFun), + unaryOperation(STRING, "length", { a -> a.length() }, emptyUnaryFun), unaryOperation(STRING, "toString", { a -> a.toString() }, emptyUnaryFun) ) diff --git a/compiler/testData/evaluate/constant/strings.kt b/compiler/testData/evaluate/constant/strings.kt index 86c706e82b0..9cf013166bf 100644 --- a/compiler/testData/evaluate/constant/strings.kt +++ b/compiler/testData/evaluate/constant/strings.kt @@ -35,4 +35,4 @@ val prop9 = "a" + "b" val prop10 = prop9 + "b" // val prop11: 6 -val prop11 = "kotlin".length() +val prop11 = "kotlin".length diff --git a/generators/src/org/jetbrains/kotlin/generators/evaluate/GenerateOperationsMap.kt b/generators/src/org/jetbrains/kotlin/generators/evaluate/GenerateOperationsMap.kt index 41be956c0d0..088437b4503 100644 --- a/generators/src/org/jetbrains/kotlin/generators/evaluate/GenerateOperationsMap.kt +++ b/generators/src/org/jetbrains/kotlin/generators/evaluate/GenerateOperationsMap.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.generators.evaluate import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil @@ -46,7 +47,7 @@ fun generate(): String { p.println("/** This file is generated by org.jetbrains.kotlin.generators.evaluate:generate(). DO NOT MODIFY MANUALLY */") p.println() - val unaryOperationsMap = arrayListOf>>() + val unaryOperationsMap = arrayListOf, Boolean>>() val binaryOperationsMap = arrayListOf>>() val builtIns = TargetPlatform.Default.builtIns @@ -57,13 +58,13 @@ fun generate(): String { for (descriptor in allPrimitiveTypes + builtIns.getString()) { @Suppress("UNCHECKED_CAST") val functions = descriptor.getMemberScope(listOf()).getDescriptors() - .filter { it is FunctionDescriptor && !EXCLUDED_FUNCTIONS.contains(it.getName().asString()) } as List + .filter { it is CallableDescriptor && !EXCLUDED_FUNCTIONS.contains(it.getName().asString()) } as List for (function in functions) { val parametersTypes = function.getParametersTypes() when (parametersTypes.size()) { - 1 -> unaryOperationsMap.add(function.getName().asString() to parametersTypes) + 1 -> unaryOperationsMap.add(Triple(function.getName().asString(), parametersTypes, function is FunctionDescriptor)) 2 -> binaryOperationsMap.add(function.getName().asString() to parametersTypes) else -> throw IllegalStateException("Couldn't add following method from builtins to operations map: ${function.getName()} in class ${descriptor.getName()}") } @@ -79,13 +80,14 @@ fun generate(): String { val unaryOperationsMapIterator = unaryOperationsMap.iterator() while (unaryOperationsMapIterator.hasNext()) { - val (funcName, parameters) = unaryOperationsMapIterator.next() + val (funcName, parameters, isFunction) = unaryOperationsMapIterator.next() + val parenthesesOrBlank = "()" //if (isFunction) "()" else "" p.println( "unaryOperation(", parameters.map { it.asString() }.joinToString(", "), ", ", "\"$funcName\"", - ", { a -> a.${funcName}() }, ", + ", { a -> a.$funcName$parenthesesOrBlank }, ", renderCheckUnaryOperation(funcName, parameters), ")", if (unaryOperationsMapIterator.hasNext()) "," else "" @@ -159,7 +161,7 @@ private fun JetType.isIntegerType(): Boolean { } -private fun FunctionDescriptor.getParametersTypes(): List { +private fun CallableDescriptor.getParametersTypes(): List { val list = arrayListOf((getContainingDeclaration() as ClassDescriptor).getDefaultType()) getValueParameters().map { it.getType() }.forEach { list.add(TypeUtils.makeNotNullable(it))