diff --git a/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.args b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.args new file mode 100644 index 00000000000..38e23ead210 --- /dev/null +++ b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/diagnosticWhenReferenceToBuiltinsMember.kt +-no-stdlib +-output +$TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt new file mode 100644 index 00000000000..6c3aeb0c785 --- /dev/null +++ b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.kt @@ -0,0 +1,6 @@ +package foo + +fun test() { + Int::toByte + String::length +} diff --git a/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.out b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.out new file mode 100644 index 00000000000..245ee8366d3 --- /dev/null +++ b/compiler/testData/cli/js/diagnosticWhenReferenceToBuiltinsMember.out @@ -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 diff --git a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java index b7d96a2e75c..272a8edd534 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java @@ -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"); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt index a4632673949..912f28ad40a 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt @@ -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 diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java index 69b7af2cb58..70656874812 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java @@ -40,6 +40,7 @@ public interface ErrorsJs { DiagnosticFactory1 JSCODE_WARNING = DiagnosticFactory1.create(WARNING, JsCodePositioningStrategy.INSTANCE$); DiagnosticFactory0 JSCODE_ARGUMENT_SHOULD_BE_CONSTANT = DiagnosticFactory0.create(ERROR, DEFAULT); DiagnosticFactory1 NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT); + DiagnosticFactory1 REFERENCE_TO_BUILTIN_MEMBERS_NOT_SUPPORTED = DiagnosticFactory1.create(ERROR, DEFAULT); @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index bfea56ea11d..13da6d85cfa 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -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) ->