JS backend: report diagnostic when try to get referenece on builtin members instead of crash with Exception.

This commit is contained in:
Zalim Bashorov
2015-03-16 22:24:32 +03:00
parent 975c4ffab5
commit 8421a15521
7 changed files with 42 additions and 19 deletions
@@ -0,0 +1,4 @@
$TESTDATA_DIR$/diagnosticWhenReferenceToBuiltinsMember.kt
-no-stdlib
-output
$TEMP_DIR$/out.js
@@ -0,0 +1,6 @@
package foo
fun test() {
Int::toByte
String::length
}
@@ -0,0 +1,5 @@
WARNING: compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt: (4, 5) The expression is unused
ERROR: compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt: (4, 8) Reflection types can't be loaded. Please ensure that you have Kotlin Runtime in your classpath
WARNING: compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt: (5, 5) The expression is unused
ERROR: compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt: (5, 11) Reflection types can't be loaded. Please ensure that you have Kotlin Runtime in your classpath
COMPILATION_ERROR
@@ -195,6 +195,12 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes
doJsTest(fileName);
}
@TestMetadata("diagnosticWhenReferenceToBuiltinsMember.args")
public void testDiagnosticWhenReferenceToBuiltinsMember() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.args");
doJsTest(fileName);
}
@TestMetadata("jsExtraHelp.args")
public void testJsExtraHelp() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/js/jsExtraHelp.args");
@@ -35,6 +35,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by Delegates.lazy {
put(ErrorsJs.JSCODE_WARNING, "JavaScript: {0}", JsCallDataTextRenderer)
put(ErrorsJs.JSCODE_ARGUMENT_SHOULD_BE_CONSTANT, "Argument must be string constant")
put(ErrorsJs.NOT_SUPPORTED, "Cannot translate (not supported yet): ''{0}''", RenderFirstLineOfElementText)
put(ErrorsJs.REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED, "Callable references for builtin members are not supported yet: ''{0}''", RenderFirstLineOfElementText)
this
@@ -40,6 +40,7 @@ public interface ErrorsJs {
DiagnosticFactory1<JetExpression, JsCallData> JSCODE_WARNING = DiagnosticFactory1.create(WARNING, JsCodePositioningStrategy.INSTANCE$);
DiagnosticFactory0<JetExpression> JSCODE_ARGUMENT_SHOULD_BE_CONSTANT = DiagnosticFactory0.create(ERROR, DEFAULT);
DiagnosticFactory1<JetElement, JetElement> NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT);
DiagnosticFactory1<JetElement, JetElement> REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT);
@SuppressWarnings("UnusedDeclaration")
Object _initializer = new Object() {
@@ -17,22 +17,17 @@
package org.jetbrains.kotlin.js.translate.reference
import com.google.dart.compiler.backend.js.ast.JsExpression
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import com.google.dart.compiler.backend.js.ast.JsInvocation
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
import org.jetbrains.kotlin.psi.JetCallableReferenceExpression
import org.jetbrains.kotlin.js.translate.utils.BindingUtils
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import com.google.dart.compiler.backend.js.ast.JsLiteral
import java.util.ArrayList
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
import org.jetbrains.kotlin.js.translate.utils.BindingUtils
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils
import org.jetbrains.kotlin.psi.JetCallableReferenceExpression
import org.jetbrains.kotlin.resolve.DescriptorUtils
import java.util.ArrayList
object CallableReferenceTranslator {
@@ -40,19 +35,24 @@ object CallableReferenceTranslator {
val descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression.getCallableReference())
return when (descriptor) {
is PropertyDescriptor ->
translateForProperty(descriptor, context)
translateForProperty(descriptor, context, expression)
is FunctionDescriptor ->
translateForFunction(descriptor, context)
translateForFunction(descriptor, context, expression)
else ->
throw IllegalArgumentException("Expected property or function: ${descriptor}, expression=${expression.getText()}")
}
}
private fun translateForFunction(descriptor: FunctionDescriptor, context: TranslationContext): JsExpression {
private fun reportNotSupported(context: TranslationContext, expression: JetCallableReferenceExpression): JsExpression {
context.bindingTrace().report(ErrorsJs.REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED.on(expression, expression))
return context.getEmptyExpression()
}
private fun translateForFunction(descriptor: FunctionDescriptor, context: TranslationContext, expression: JetCallableReferenceExpression): JsExpression {
return when {
// TODO Support for callable reference to builtin functions and members
JsDescriptorUtils.isBuiltin(descriptor) ->
throw UnsupportedOperationException("callable references for builtin functions are not supported yet")
reportNotSupported(context, expression)
isConstructor(descriptor) ->
translateForConstructor(descriptor, context)
isExtension(descriptor) ->
@@ -64,11 +64,11 @@ object CallableReferenceTranslator {
}
}
private fun translateForProperty(descriptor: PropertyDescriptor, context: TranslationContext): JsExpression {
private fun translateForProperty(descriptor: PropertyDescriptor, context: TranslationContext, expression: JetCallableReferenceExpression): JsExpression {
return when {
// TODO Support for callable reference to builtin properties
JsDescriptorUtils.isBuiltin(descriptor) ->
throw UnsupportedOperationException("callable references for builtin properties are not supported yet")
reportNotSupported(context, expression)
isExtension(descriptor) ->
translateForExtensionProperty(descriptor, context)
isMember(descriptor) ->