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:
@@ -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) {
|
||||
|
||||
+16
-8
@@ -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));
|
||||
|
||||
+18
-3
@@ -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);
|
||||
|
||||
+6
-5
@@ -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);
|
||||
|
||||
+6
-4
@@ -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);
|
||||
|
||||
+71
@@ -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"
|
||||
|
||||
+9
@@ -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"
|
||||
+11
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+66
-1
@@ -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>()) {
|
||||
|
||||
Reference in New Issue
Block a user