Resolve invoke on class objects and enum entries

Added FakeCallableDescriptorForObject to make a resolved call
with object as variable in 'variable as function call'

 #KT-4321 Fixed
 #KT-4863 Fixed
This commit is contained in:
Svetlana Isakova
2014-07-18 18:58:03 +04:00
parent 19d35b8ec6
commit e4e09d6c70
34 changed files with 551 additions and 22 deletions
@@ -49,6 +49,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.calls.model.*;
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.IntegerValueTypeConstant;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
@@ -1692,6 +1693,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
receiver = StackValue.receiver(resolvedCall, receiver, this, null);
descriptor = resolvedCall.getResultingDescriptor();
if (descriptor instanceof FakeCallableDescriptorForObject) {
descriptor = ((FakeCallableDescriptorForObject) descriptor).getReferencedDescriptor();
}
}
//if (descriptor instanceof VariableAsFunctionDescriptor) {
@@ -34,6 +34,7 @@ import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsUtil;
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.IntegerValueConstant;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -81,7 +82,7 @@ public class CallExpressionResolver {
JetType classObjectType = classifier.getClassObjectType();
if (classObjectType != null) {
context.trace.record(REFERENCE_TARGET, expression, classifier);
JetType result = getExtendedClassObjectType(expression, classObjectType, classifier, context);
JetType result = getExtendedClassObjectType(expression, classObjectType, classifier, context.scope);
checkClassObjectVisibility(classifier, expression, context);
return result;
}
@@ -153,7 +154,7 @@ public class CallExpressionResolver {
@NotNull JetSimpleNameExpression expression,
@NotNull JetType classObjectType,
@NotNull ClassifierDescriptor classifier,
@NotNull ResolutionContext context
@NotNull JetScope receiverScope
) {
if (!isLHSOfDot(expression) || !(classifier instanceof ClassDescriptor)) {
return classObjectType;
@@ -170,7 +171,7 @@ public class CallExpressionResolver {
scopes.add(getStaticNestedClassesScope(classDescriptor));
Name referencedName = expression.getReferencedNameAsName();
PackageViewDescriptor packageView = context.scope.getPackage(referencedName);
PackageViewDescriptor packageView = receiverScope.getPackage(referencedName);
if (packageView != null) {
//for enums loaded from java binaries
scopes.add(packageView.getMemberScope());
@@ -253,16 +254,23 @@ public class CallExpressionResolver {
context.replaceTraceAndCache(temporaryForVariable),
call, CheckValueArgumentsMode.ENABLED);
OverloadResolutionResults<VariableDescriptor> resolutionResult = callResolver.resolveSimpleProperty(contextForVariable);
JetScope receiverScope = receiver.exists() ? receiver.getType().getMemberScope() : context.scope;
if (resolutionResult.isSuccess()) {
result[0] = true;
if (resolutionResult.getResultingDescriptor() instanceof FakeCallableDescriptorForObject) {
FakeCallableDescriptorForObject fakeCallableDescriptorForObject =
(FakeCallableDescriptorForObject) resolutionResult.getResultingDescriptor();
ClassDescriptor classDescriptor = fakeCallableDescriptorForObject.getClassDescriptor();
context.trace.record(REFERENCE_TARGET, nameExpression, classDescriptor);
checkClassObjectVisibility(classDescriptor, nameExpression, context);
return getExtendedClassObjectType(nameExpression, fakeCallableDescriptorForObject.getType(), classDescriptor, receiverScope);
}
temporaryForVariable.commit();
checkSuper(receiver, resolutionResult, context.trace, nameExpression);
result[0] = true;
return resolutionResult.isSingleResult() ? resolutionResult.getResultingDescriptor().getReturnType() : null;
return resolutionResult.getResultingDescriptor().getReturnType();
}
ExpressionTypingContext newContext = receiver.exists()
? context.replaceScope(receiver.getType().getMemberScope())
: context;
ExpressionTypingContext newContext = context.replaceScope(receiverScope);
TemporaryTraceAndCache temporaryForPackageOrClassObject = TemporaryTraceAndCache.create(
context, "trace to resolve as package or class object", nameExpression);
JetType jetType = lookupPackageOrClassObject(nameExpression, newContext.replaceTraceAndCache(temporaryForPackageOrClassObject));
@@ -21,6 +21,7 @@ import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.ErrorUtils;
@@ -97,6 +98,15 @@ public class CallableDescriptorCollectors<D extends CallableDescriptor> implemen
private static class VariableCollector implements CallableDescriptorCollector<VariableDescriptor> {
private static void addFakeDescriptorForObject(JetScope scope, Name name, Collection<VariableDescriptor> variables) {
ClassifierDescriptor classifier = scope.getClassifier(name);
if (!(classifier instanceof ClassDescriptor)) return;
JetType classObjectType = classifier.getClassObjectType();
if (classObjectType == null) return;
variables.add(new FakeCallableDescriptorForObject((ClassDescriptor) classifier));
}
@NotNull
@Override
public Collection<VariableDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
@@ -105,19 +115,24 @@ public class CallableDescriptorCollectors<D extends CallableDescriptor> implemen
return Collections.singleton(localVariable);
}
LinkedHashSet<VariableDescriptor> variables = Sets.newLinkedHashSet();
Set<VariableDescriptor> variables = Sets.newLinkedHashSet();
for (VariableDescriptor variable : scope.getProperties(name)) {
if (variable.getReceiverParameter() == null) {
variables.add(variable);
}
}
addFakeDescriptorForObject(scope, name, variables);
return variables;
}
@NotNull
@Override
public Collection<VariableDescriptor> getMembersByName(@NotNull JetType receiverType, Name name, @NotNull BindingTrace bindingTrace) {
return receiverType.getMemberScope().getProperties(name);
JetScope memberScope = receiverType.getMemberScope();
Collection<VariableDescriptor> members = Lists.newArrayList();
members.addAll(memberScope.getProperties(name));
addFakeDescriptorForObject(memberScope, name, members);
return members;
}
@NotNull
@@ -141,7 +156,7 @@ public class CallableDescriptorCollectors<D extends CallableDescriptor> implemen
private static class PropertyCollector implements CallableDescriptorCollector<VariableDescriptor> {
private static Collection<VariableDescriptor> filterProperties(Collection<? extends VariableDescriptor> variableDescriptors) {
ArrayList<VariableDescriptor> properties = Lists.newArrayList();
List<VariableDescriptor> properties = Lists.newArrayList();
for (VariableDescriptor descriptor : variableDescriptors) {
if (descriptor instanceof PropertyDescriptor) {
properties.add(descriptor);
@@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSuperExpression;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastUtils;
import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -280,12 +279,14 @@ public class TaskPrioritizer {
@NotNull ExplicitReceiverKind explicitReceiverKind,
@NotNull Call call
) {
for (D extension : descriptors) {
if (extension instanceof ConstructorDescriptor && DescriptorUtils.isStaticNestedClass(extension.getContainingDeclaration())) {
// We don't want static nested classes' constructors to be resolved with expectedThisObject
for (D descriptor : descriptors) {
if (descriptor instanceof ConstructorDescriptor && DescriptorUtils.isStaticNestedClass(descriptor.getContainingDeclaration())
|| descriptor instanceof FakeCallableDescriptorForObject) {
// We don't want static nested class constructor or class object / object (as callable)
// to be resolved with expectedThisObject
continue;
}
ResolutionCandidate<D> candidate = ResolutionCandidate.create(call, extension);
ResolutionCandidate<D> candidate = ResolutionCandidate.create(call, descriptor);
candidate.setThisObject(thisObject);
candidate.setReceiverArgument(receiverParameter);
candidate.setExplicitReceiverKind(explicitReceiverKind);
@@ -24,15 +24,14 @@ import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject;
import org.jetbrains.jet.lang.types.ErrorUtils;
import java.util.Collection;
import static org.jetbrains.jet.lang.diagnostics.Errors.UNRESOLVED_REFERENCE;
import static org.jetbrains.jet.lang.diagnostics.Errors.UNRESOLVED_REFERENCE_WRONG_RECEIVER;
import static org.jetbrains.jet.lang.resolve.BindingContext.CALL;
import static org.jetbrains.jet.lang.resolve.BindingContext.REFERENCE_TARGET;
import static org.jetbrains.jet.lang.resolve.BindingContext.RESOLVED_CALL;
import static org.jetbrains.jet.lang.resolve.BindingContext.*;
public class TracingStrategyImpl extends AbstractTracingStrategy {
private final JetReferenceExpression reference;
@@ -54,10 +53,13 @@ public class TracingStrategyImpl extends AbstractTracingStrategy {
@Override
public <D extends CallableDescriptor> void bindReference(@NotNull BindingTrace trace, @NotNull ResolvedCall<D> resolvedCall) {
CallableDescriptor descriptor = resolvedCall.getCandidateDescriptor();
DeclarationDescriptor descriptor = resolvedCall.getCandidateDescriptor();
if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
descriptor = ((VariableAsFunctionResolvedCall) resolvedCall).getVariableCall().getCandidateDescriptor();
}
if (descriptor instanceof FakeCallableDescriptorForObject) {
descriptor = ((FakeCallableDescriptorForObject) descriptor).getReferencedDescriptor();
}
DeclarationDescriptor storedReference = trace.get(REFERENCE_TARGET, reference);
if (storedReference == null || !ErrorUtils.isError(descriptor)) {
trace.record(REFERENCE_TARGET, reference, descriptor);
@@ -0,0 +1,71 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.calls.util
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
import java.util.Collections
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.jet.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant
import org.jetbrains.jet.lang.descriptors.SourceElement
import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.resolve.descriptorUtil.getClassObjectReferenceTarget
public class FakeCallableDescriptorForObject(
private val classDescriptor: ClassDescriptor
) : DeclarationDescriptorWithVisibility by classDescriptor.getClassObjectReferenceTarget(), VariableDescriptor {
{
assert(classDescriptor.getClassObjectType() != null) {
"FakeCallableDescriptorForObject can be created only for objects, classes with class object or enum entries: $classDescriptor"
}
}
public fun getReferencedDescriptor(): ClassDescriptor = classDescriptor.getClassObjectReferenceTarget()
override fun getReceiverParameter(): ReceiverParameterDescriptor? = null
override fun getExpectedThisObject(): ReceiverParameterDescriptor? = null
override fun getTypeParameters(): List<TypeParameterDescriptor> = Collections.emptyList()
override fun getValueParameters(): List<ValueParameterDescriptor> = Collections.emptyList()
override fun getReturnType(): JetType? = getType()
override fun hasSynthesizedParameterNames() = false
override fun hasStableParameterNames() = false
override fun getOverriddenDescriptors(): Set<CallableDescriptor> = Collections.emptySet()
override fun getType(): JetType = classDescriptor.getClassObjectType()!!
override fun isVar() = false
override fun getOriginal(): CallableDescriptor = this
override fun getCompileTimeInitializer(): CompileTimeConstant<out Any?>? = null
override fun getSource(): SourceElement = classDescriptor.getSource()
}
@@ -0,0 +1,8 @@
class A {
class object {
fun invoke(i: Int) = i
}
}
fun box() = if (A(42) == 42) "OK" else "fail"
@@ -0,0 +1,11 @@
trait B
fun B.invoke(i: Int) = i
class A {
class object: B {
}
}
fun box() = if (A(42) == 42) "OK" else "fail"
@@ -0,0 +1,9 @@
class A {
class Nested {
class object {
fun invoke(i: Int) = i
}
}
}
fun box() = if (A.Nested(42) == 42) "OK" else "fail"
@@ -0,0 +1,11 @@
import A.Nested
class A {
class Nested {
class object {
fun invoke(i: Int) = i
}
}
}
fun box() = if (Nested(42) == 42) "OK" else "fail"
@@ -0,0 +1,8 @@
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun box() = if (A.ONE(42) == 42) "OK" else "fail"
@@ -0,0 +1,8 @@
enum class A {
ONE
TWO
}
fun A.invoke(i: Int) = i
fun box() = if (A.ONE(42) == 42) "OK" else "fail"
@@ -0,0 +1,10 @@
import A.ONE
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun box() = if (ONE(42) == 42) "OK" else "fail"
@@ -0,0 +1,10 @@
import A.ONE
enum class A {
ONE
TWO
}
fun A.invoke(i: Int) = i
fun box() = if (ONE(42) == 42) "OK" else "fail"
@@ -0,0 +1,5 @@
object A
fun A.invoke(i: Int) = i
fun box() = if (A(42) == 42) "OK" else "fail"
@@ -0,0 +1,5 @@
object A {
fun invoke(i: Int) = i
}
fun box() = if (A(42) == 42) "OK" else "fail"
@@ -0,0 +1,35 @@
//KT-4321 invoke() on enum doesn't work
import DOMElementTestClasses.cls2
// use case 1
enum class DOMElementTestClasses {
cls1 cls2
fun invoke() {}
}
// use case 2
trait EnumStyleClass {
fun invoke() {}
}
enum class TestClasses : EnumStyleClass {
cls
}
// example
fun main(args: Array<String>) {
// Kotlin: Expression 'cls1' of type 'DOMElementTestClasses' cannot be invoked as a function
DOMElementTestClasses.cls1()
// Kotlin: Expression 'cls2' of type 'DOMElementTestClasses' cannot be invoked as a function
cls2()
// Kotlin: Expression 'cls' of type 'TestClasses' cannot be invoked as a function
TestClasses.cls()
// All ok
val cls = DOMElementTestClasses.cls2
cls()
}
@@ -0,0 +1,7 @@
class A {
class object {
fun invoke(i: Int) = i
}
}
fun test() = <caret>A(1)
@@ -0,0 +1,16 @@
class A {
class object {
fun invoke(i: Int) = i
}
}
fun test() = <caret>A(1)
Resolved call:
Resulting descriptor: class A
Explicit receiver kind = NO_EXPLICIT_RECEIVER
This object = NO_RECEIVER
Receiver argument = NO_RECEIVER
@@ -0,0 +1,7 @@
class A {
class object {
fun invoke(i: Int) = i
}
}
fun test() = A<caret>(1)
@@ -0,0 +1,20 @@
class A {
class object {
fun invoke(i: Int) = i
}
}
fun test() = A<caret>(1)
Resolved call:
Resulting descriptor: fun invoke(i: Int): Int
Explicit receiver kind = THIS_OBJECT
This object = A {<class-object-for-A>}
Receiver argument = NO_RECEIVER
Value arguments mapping:
SUCCESS i : Int = 1
@@ -0,0 +1,8 @@
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun test() = A.<caret>ONE(1)
@@ -0,0 +1,17 @@
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun test() = A.<caret>ONE(1)
Resolved call:
Resulting descriptor: enum entry ONE : A
Explicit receiver kind = NO_EXPLICIT_RECEIVER
This object = NO_RECEIVER
Receiver argument = NO_RECEIVER
@@ -0,0 +1,8 @@
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun test() = A.ONE<caret>(1)
@@ -0,0 +1,21 @@
enum class A {
ONE
TWO
fun invoke(i: Int) = i
}
fun test() = A.ONE<caret>(1)
Resolved call:
Resulting descriptor: fun invoke(i: Int): Int
Explicit receiver kind = THIS_OBJECT
This object = ONE {A}
Receiver argument = NO_RECEIVER
Value arguments mapping:
SUCCESS i : Int = 1
@@ -0,0 +1,5 @@
object A {
fun invoke(i: Int) = i
}
fun test() = <caret>A(1)
@@ -0,0 +1,14 @@
object A {
fun invoke(i: Int) = i
}
fun test() = <caret>A(1)
Resolved call:
Resulting descriptor: object A
Explicit receiver kind = NO_EXPLICIT_RECEIVER
This object = NO_RECEIVER
Receiver argument = NO_RECEIVER
@@ -0,0 +1,5 @@
object A {
fun invoke(i: Int) = i
}
fun test() = A<caret>(1)
@@ -0,0 +1,18 @@
object A {
fun invoke(i: Int) = i
}
fun test() = A<caret>(1)
Resolved call:
Resulting descriptor: fun invoke(i: Int): Int
Explicit receiver kind = THIS_OBJECT
This object = A {A}
Receiver argument = NO_RECEIVER
Value arguments mapping:
SUCCESS i : Int = 1
@@ -27,7 +27,7 @@ import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class, JetDiagnosticsTestGenerated.TailRecursion.class})
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class, JetDiagnosticsTestGenerated.TailRecursion.class, JetDiagnosticsTestGenerated.OnObjects.class})
public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
@TestMetadata("compiler/testData/diagnostics/tests")
@InnerTestClasses({Tests.Annotations.class, Tests.BackingField.class, Tests.Cast.class, Tests.CheckArguments.class, Tests.ClassObjects.class, Tests.ControlFlowAnalysis.class, Tests.ControlStructures.class, Tests.CyclicHierarchy.class, Tests.DataClasses.class, Tests.DataFlow.class, Tests.DataFlowInfoTraversal.class, Tests.DeclarationChecks.class, Tests.DelegatedProperty.class, Tests.Deparenthesize.class, Tests.DuplicateJvmSignature.class, Tests.Enum.class, Tests.Evaluate.class, Tests.Extensions.class, Tests.FunctionLiterals.class, Tests.Generics.class, Tests.Imports.class, Tests.IncompleteCode.class, Tests.Inference.class, Tests.Infos.class, Tests.Inline.class, Tests.Inner.class, Tests.J_k.class, Tests.Jdk_annotations.class, Tests.Labels.class, Tests.Library.class, Tests.Multimodule.class, Tests.NamedArguments.class, Tests.NullabilityAndAutoCasts.class, Tests.NullableTypes.class, Tests.Numbers.class, Tests.Objects.class, Tests.OperatorsOverloading.class, Tests.Overload.class, Tests.Override.class, Tests.Recovery.class, Tests.Redeclarations.class, Tests.Regressions.class, Tests.Resolve.class, Tests.Scopes.class, Tests.SenselessComparison.class, Tests.Shadowing.class, Tests.SmartCasts.class, Tests.Substitutions.class, Tests.Subtyping.class, Tests.Suppress.class, Tests.ThisAndSuper.class, Tests.TraitWithRequired.class, Tests.Typedefs.class, Tests.Unit.class, Tests.Varargs.class, Tests.When.class})
@@ -7047,6 +7047,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest("compiler/testData/diagnostics/tests/resolve/invoke/kt4204-completeNestedCallsForInvoke.kt");
}
@TestMetadata("kt4321InvokeOnEnum.kt")
public void testKt4321InvokeOnEnum() throws Exception {
doTest("compiler/testData/diagnostics/tests/resolve/invoke/kt4321InvokeOnEnum.kt");
}
@TestMetadata("valNamedInvoke.kt")
public void testValNamedInvoke() throws Exception {
doTest("compiler/testData/diagnostics/tests/resolve/invoke/valNamedInvoke.kt");
@@ -8410,11 +8415,70 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
}
@TestMetadata("compiler/testData/codegen/box/functions/invoke/onObjects")
public static class OnObjects extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInOnObjects() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/functions/invoke/onObjects"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("invokeOnClassObject1.kt")
public void testInvokeOnClassObject1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObject1.kt");
}
@TestMetadata("invokeOnClassObject2.kt")
public void testInvokeOnClassObject2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObject2.kt");
}
@TestMetadata("invokeOnClassObjectOfNestedClass1.kt")
public void testInvokeOnClassObjectOfNestedClass1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObjectOfNestedClass1.kt");
}
@TestMetadata("invokeOnClassObjectOfNestedClass2.kt")
public void testInvokeOnClassObjectOfNestedClass2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObjectOfNestedClass2.kt");
}
@TestMetadata("invokeOnEnum1.kt")
public void testInvokeOnEnum1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnEnum1.kt");
}
@TestMetadata("invokeOnEnum2.kt")
public void testInvokeOnEnum2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnEnum2.kt");
}
@TestMetadata("invokeOnImportedEnum1.kt")
public void testInvokeOnImportedEnum1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnImportedEnum1.kt");
}
@TestMetadata("invokeOnImportedEnum2.kt")
public void testInvokeOnImportedEnum2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnImportedEnum2.kt");
}
@TestMetadata("invokeOnObject1.kt")
public void testInvokeOnObject1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnObject1.kt");
}
@TestMetadata("invokeOnObject2.kt")
public void testInvokeOnObject2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnObject2.kt");
}
}
public static Test suite() {
TestSuite suite = new TestSuite("JetDiagnosticsTestGenerated");
suite.addTest(Tests.innerSuite());
suite.addTestSuite(Script.class);
suite.addTestSuite(TailRecursion.class);
suite.addTestSuite(OnObjects.class);
return suite;
}
}
@@ -2672,6 +2672,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
}
@TestMetadata("compiler/testData/codegen/box/functions/invoke")
@InnerTestClasses({Invoke.OnObjects.class})
public static class Invoke extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInInvoke() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/functions/invoke"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -2732,6 +2733,70 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/functions/invoke/kt3822invokeOnThis.kt");
}
@TestMetadata("compiler/testData/codegen/box/functions/invoke/onObjects")
public static class OnObjects extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInOnObjects() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/functions/invoke/onObjects"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("invokeOnClassObject1.kt")
public void testInvokeOnClassObject1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObject1.kt");
}
@TestMetadata("invokeOnClassObject2.kt")
public void testInvokeOnClassObject2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObject2.kt");
}
@TestMetadata("invokeOnClassObjectOfNestedClass1.kt")
public void testInvokeOnClassObjectOfNestedClass1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObjectOfNestedClass1.kt");
}
@TestMetadata("invokeOnClassObjectOfNestedClass2.kt")
public void testInvokeOnClassObjectOfNestedClass2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnClassObjectOfNestedClass2.kt");
}
@TestMetadata("invokeOnEnum1.kt")
public void testInvokeOnEnum1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnEnum1.kt");
}
@TestMetadata("invokeOnEnum2.kt")
public void testInvokeOnEnum2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnEnum2.kt");
}
@TestMetadata("invokeOnImportedEnum1.kt")
public void testInvokeOnImportedEnum1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnImportedEnum1.kt");
}
@TestMetadata("invokeOnImportedEnum2.kt")
public void testInvokeOnImportedEnum2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnImportedEnum2.kt");
}
@TestMetadata("invokeOnObject1.kt")
public void testInvokeOnObject1() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnObject1.kt");
}
@TestMetadata("invokeOnObject2.kt")
public void testInvokeOnObject2() throws Exception {
doTest("compiler/testData/codegen/box/functions/invoke/onObjects/invokeOnObject2.kt");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("Invoke");
suite.addTestSuite(Invoke.class);
suite.addTestSuite(OnObjects.class);
return suite;
}
}
@TestMetadata("compiler/testData/codegen/box/functions/localFunctions")
@@ -2993,7 +3058,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
public static Test innerSuite() {
TestSuite suite = new TestSuite("Functions");
suite.addTestSuite(Functions.class);
suite.addTestSuite(Invoke.class);
suite.addTest(Invoke.innerSuite());
suite.addTestSuite(LocalFunctions.class);
suite.addTestSuite(TailRecursion.class);
return suite;
@@ -314,6 +314,36 @@ public class ResolvedCallsTestGenerated extends AbstractResolvedCallsTest {
doTest("compiler/testData/resolvedCalls/invoke/implicitReceiverForInvoke.kt");
}
@TestMetadata("invokeOnClassObject1.kt")
public void testInvokeOnClassObject1() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnClassObject1.kt");
}
@TestMetadata("invokeOnClassObject2.kt")
public void testInvokeOnClassObject2() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnClassObject2.kt");
}
@TestMetadata("invokeOnEnumEntry1.kt")
public void testInvokeOnEnumEntry1() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnEnumEntry1.kt");
}
@TestMetadata("invokeOnEnumEntry2.kt")
public void testInvokeOnEnumEntry2() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnEnumEntry2.kt");
}
@TestMetadata("invokeOnObject1.kt")
public void testInvokeOnObject1() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnObject1.kt");
}
@TestMetadata("invokeOnObject2.kt")
public void testInvokeOnObject2() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/invokeOnObject2.kt");
}
@TestMetadata("receiverArgumentAsReceiverForInvoke.kt")
public void testReceiverArgumentAsReceiverForInvoke() throws Exception {
doTest("compiler/testData/resolvedCalls/invoke/receiverArgumentAsReceiverForInvoke.kt");
@@ -32,6 +32,7 @@ public interface CallableDescriptor extends DeclarationDescriptorWithVisibility,
@Nullable
ReceiverParameterDescriptor getExpectedThisObject();
@KotlinSignature("fun getTypeParameters(): List<TypeParameterDescriptor>")
@NotNull
List<TypeParameterDescriptor> getTypeParameters();
@@ -48,6 +49,7 @@ public interface CallableDescriptor extends DeclarationDescriptorWithVisibility,
@Override
CallableDescriptor substitute(@NotNull TypeSubstitutor substitutor);
@KotlinSignature("fun getValueParameters(): List<ValueParameterDescriptor>")
@NotNull
List<ValueParameterDescriptor> getValueParameters();
@@ -128,6 +128,7 @@ fun main(args: Array<String>) {
model("diagnostics/tests")
model("diagnostics/tests/script", extension = "kts")
model("codegen/box/functions/tailRecursion")
model("codegen/box/functions/invoke/onObjects")
}
testClass(javaClass<AbstractJetDiagnosticsTestWithStdLib>()) {