diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt index a45452f7de4..a28ca812fe2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt index c4402f2caae..c1411b4de1c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -16,35 +16,12 @@ package org.jetbrains.kotlin.load.java.sam -import org.jetbrains.kotlin.descriptors.ClassifierDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.load.java.components.SamConversionResolver import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.load.java.descriptors.JavaClassConstructorDescriptor -import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor -import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor -import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.SimpleType class SamConversionResolverImpl(val storageManager: StorageManager, val samWithReceiverResolver: SamWithReceiverResolver): SamConversionResolver { - override fun resolveSamConstructor(constructorOwner: DeclarationDescriptor, classifier: () -> ClassifierDescriptor?): SamConstructorDescriptor? { - val classifierDescriptor = classifier() - if (classifierDescriptor !is LazyJavaClassDescriptor || classifierDescriptor.functionTypeForSamInterface == null) return null - return SingleAbstractMethodUtils.createSamConstructorFunction(constructorOwner, classifierDescriptor) - } - - @Suppress("UNCHECKED_CAST") - override fun resolveSamAdapter(original: D): D? { - return when { - !SingleAbstractMethodUtils.isSamAdapterNecessary(original) -> null - original is JavaClassConstructorDescriptor -> SingleAbstractMethodUtils.createSamAdapterConstructor(original) as D - original is JavaMethodDescriptor -> SingleAbstractMethodUtils.createSamAdapterFunction(original) as D - else -> null - } - } - private val functionTypesForSamInterfaces = storageManager.createCacheWithNullableValues() override fun resolveFunctionTypeIfSamInterface(classDescriptor: JavaClassDescriptor): SimpleType? { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index fe70c96735a..14414907049 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -180,9 +180,18 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l override fun getSyntheticStaticFunctions(scope: ResolutionScope, name: Name, location: LookupLocation): Collection = emptyList() + override fun getSyntheticConstructors(scope: ResolutionScope, name: Name, location: LookupLocation): Collection + = emptyList() + override fun getSyntheticStaticFunctions(scope: ResolutionScope): Collection = emptyList() + override fun getSyntheticConstructors(scope: ResolutionScope): Collection + = emptyList() + + override fun getSyntheticConstructor(constructor: ConstructorDescriptor): ConstructorDescriptor? + = null + private fun collectSyntheticPropertiesByName(result: SmartList?, type: TypeConstructor, name: Name, processedTypes: MutableSet?, location: LookupLocation): SmartList? { if (processedTypes != null && !processedTypes.add(type)) return result diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 3caba92f109..df285df666a 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor -import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor -import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor +import org.jetbrains.kotlin.load.java.descriptors.* import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils import org.jetbrains.kotlin.name.Name @@ -38,8 +37,6 @@ import org.jetbrains.kotlin.resolve.scopes.SyntheticScope import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.findCorrespondingSupertype -import java.util.* -import kotlin.collections.LinkedHashSet import kotlin.properties.Delegates interface SamAdapterExtensionFunctionDescriptor : FunctionDescriptor, SyntheticMemberDescriptor { @@ -61,7 +58,18 @@ class SamAdapterFunctionsScope( private val samConstructorForClassifier = storageManager.createMemoizedFunction { classifier -> - samConstructorForClassifierNotCached(classifier) + SingleAbstractMethodUtils.createSamConstructorFunction(classifier.containingDeclaration, classifier) + } + + private val samConstructorForJavaConstructor = + storageManager.createMemoizedFunction { constructor -> + SingleAbstractMethodUtils.createSamAdapterConstructor(constructor) as ClassConstructorDescriptor + } + + private val samConstructorForTypeAliasConstructor = + storageManager.createMemoizedFunctionWithNullableValues, TypeAliasConstructorDescriptor> { + (constructor, typeAliasDescriptor) -> + TypeAliasConstructorDescriptorImpl.createIfAvailable(storageManager, typeAliasDescriptor, constructor) } private fun extensionForFunctionNotCached(function: FunctionDescriptor): FunctionDescriptor? { @@ -73,10 +81,6 @@ class SamAdapterFunctionsScope( return MyFunctionDescriptor.create(function) } - private fun samConstructorForClassifierNotCached(classifier: JavaClassDescriptor): SamConstructorDescriptor { - return SingleAbstractMethodUtils.createSamConstructorFunction(classifier.containingDeclaration, classifier) - } - override fun getSyntheticMemberFunctions(receiverTypes: Collection, name: Name, location: LookupLocation): Collection { var result: SmartList? = null for (type in receiverTypes) { @@ -124,18 +128,41 @@ class SamAdapterFunctionsScope( override fun getSyntheticExtensionProperties(receiverTypes: Collection): Collection = emptyList() override fun getSyntheticStaticFunctions(scope: ResolutionScope, name: Name, location: LookupLocation): Collection { - val classifier = scope.getContributedClassifier(name, location) - val samConstructor = classifier?.let { getSamConstructor(it) } - return getSamFunctions(scope.getContributedFunctions(name, location)) + listOfNotNull(samConstructor) + return getSamFunctions(scope.getContributedFunctions(name, location)) + } + + override fun getSyntheticConstructors(scope: ResolutionScope, name: Name, location: LookupLocation): Collection { + val classifier = scope.getContributedClassifier(name, location) ?: return emptyList() + return getAllSamConstructors(classifier) } override fun getSyntheticStaticFunctions(scope: ResolutionScope): Collection { - val samConstructors = - scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) - .filterIsInstance() - .mapNotNull{ getSamConstructor(it) } + return getSamFunctions(scope.getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)) + } - return getSamFunctions(scope.getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)) + samConstructors + override fun getSyntheticConstructors(scope: ResolutionScope): Collection { + return scope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) + .filterIsInstance() + .flatMap { getAllSamConstructors(it) } + } + + override fun getSyntheticConstructor(constructor: ConstructorDescriptor): ConstructorDescriptor? { + return when (constructor) { + is JavaClassConstructorDescriptor -> createJavaSamAdapterConstructor(constructor) + is TypeAliasConstructorDescriptor -> { + val underlyingConstructor = constructor.underlyingConstructorDescriptor + if (underlyingConstructor !is JavaClassConstructorDescriptor) return null + val underlyingSamConstructor = createJavaSamAdapterConstructor(underlyingConstructor) ?: return null + + samConstructorForTypeAliasConstructor(Pair(underlyingSamConstructor, constructor.typeAliasDescriptor)) + } + else -> null + } + } + + private fun createJavaSamAdapterConstructor(constructor: JavaClassConstructorDescriptor): ClassConstructorDescriptor? { + if (!SingleAbstractMethodUtils.isSamAdapterNecessary(constructor)) return null + return samConstructorForJavaConstructor(constructor) } private fun getSamFunctions(functions: Collection): List> { @@ -148,6 +175,21 @@ class SamAdapterFunctionsScope( } } + private fun getAllSamConstructors(classifier: ClassifierDescriptor): List { + return getSamAdaptersFromConstructors(classifier) + listOfNotNull(getSamConstructor(classifier)) + } + + private fun getSamAdaptersFromConstructors(classifier: ClassifierDescriptor): List { + if (classifier !is JavaClassDescriptor) return emptyList() + + return arrayListOf().apply { + for (constructor in classifier.constructors) { + val samConstructor = getSyntheticConstructor(constructor) ?: continue + add(samConstructor) + } + } + } + private fun getSamConstructor(classifier: ClassifierDescriptor): SamConstructorDescriptor? { if (classifier is TypeAliasDescriptor) { return getTypeAliasSamConstructor(classifier) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index ddf84dbd43a..5a6c3085931 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.scopes.LexicalScope; +import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes; import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinTypeKt; @@ -70,6 +71,7 @@ public class CallResolver { private GenericCandidateResolver genericCandidateResolver; private CallCompleter callCompleter; private NewResolutionOldInference newCallResolver; + private SyntheticScopes syntheticScopes; private final KotlinBuiltIns builtIns; private final LanguageVersionSettings languageVersionSettings; @@ -119,6 +121,11 @@ public class CallResolver { this.newCallResolver = newCallResolver; } + @Inject + public void setSyntheticScopes(@NotNull SyntheticScopes syntheticScopes) { + this.syntheticScopes = syntheticScopes; + } + @NotNull public OverloadResolutionResults resolveSimpleProperty(@NotNull BasicCallResolutionContext context) { KtExpression calleeExpression = context.call.getCalleeExpression(); @@ -357,7 +364,7 @@ public class CallResolver { @NotNull KotlinType constructedType ) { Pair>, BasicCallResolutionContext> candidatesAndContext = - prepareCandidatesAndContextForConstructorCall(constructedType, context); + prepareCandidatesAndContextForConstructorCall(constructedType, context, syntheticScopes); Collection> candidates = candidatesAndContext.getFirst(); context = candidatesAndContext.getSecond(); @@ -437,7 +444,7 @@ public class CallResolver { DescriptorUtils.getSuperClassType(currentClassDescriptor); Pair>, BasicCallResolutionContext> candidatesAndContext = - prepareCandidatesAndContextForConstructorCall(superType, context); + prepareCandidatesAndContextForConstructorCall(superType, context, syntheticScopes); Collection> candidates = candidatesAndContext.getFirst(); context = candidatesAndContext.getSecond(); @@ -459,7 +466,8 @@ public class CallResolver { @NotNull private static Pair>, BasicCallResolutionContext> prepareCandidatesAndContextForConstructorCall( @NotNull KotlinType superType, - @NotNull BasicCallResolutionContext context + @NotNull BasicCallResolutionContext context, + @NotNull SyntheticScopes syntheticScopes ) { if (!(superType.getConstructor().getDeclarationDescriptor() instanceof ClassDescriptor)) { return new Pair<>(Collections.>emptyList(), context); @@ -474,9 +482,9 @@ public class CallResolver { context = context.replaceExpectedType(superType); } - Collection> candidates = + List> candidates = CallResolverUtilKt.createResolutionCandidatesForConstructors( - context.scope, context.call, superType, !anyConstructorHasDeclaredTypeParameters + context.scope, context.call, superType, !anyConstructorHasDeclaredTypeParameters, syntheticScopes ); return new Pair<>(candidates, context); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt index 5f4cb0126dd..8d2b7003ed2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -35,6 +35,8 @@ import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionCandidate import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.SyntheticScopes +import org.jetbrains.kotlin.resolve.scopes.collectSyntheticConstructors import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy @@ -192,8 +194,9 @@ fun createResolutionCandidatesForConstructors( lexicalScope: LexicalScope, call: Call, typeWithConstructors: KotlinType, - useKnownTypeSubstitutor: Boolean -): Collection> { + useKnownTypeSubstitutor: Boolean, + syntheticScopes: SyntheticScopes +): List> { val classWithConstructors = typeWithConstructors.constructor.declarationDescriptor as ClassDescriptor val unwrappedType = typeWithConstructors.unwrap() @@ -233,7 +236,9 @@ fun createResolutionCandidatesForConstructors( dispatchReceiver = null } - return constructors.map { + val syntheticConstructors = constructors.flatMap { syntheticScopes.collectSyntheticConstructors(it) } + + return (constructors + syntheticConstructors).map { ResolutionCandidate.create(call, it, dispatchReceiver, receiverKind, knownSubstitutor) } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index cead12b38eb..2a00d263d8e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -284,6 +284,7 @@ private fun ResolutionScope.getContributedFunctionsAndConstructors( callableConstructors.filterTo(result) { it.dispatchReceiverParameter == null } result.addAll(syntheticScopes.collectSyntheticStaticFunctions(scope, name, location)) + result.addAll(syntheticScopes.collectSyntheticConstructors(scope, name, location)) return result.toList() } diff --git a/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.kt b/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.kt new file mode 100644 index 00000000000..ab708f9a374 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.kt @@ -0,0 +1,18 @@ +// FILE: OnSubscribe.java +public interface OnSubscribe { + void f(); +} + +// FILE: Observable.java +public class Observable { + public Observable(OnSubscribe f) { + } +} + +// FILE: Kotlin.kt + +typealias ObservableAlias = Observable +typealias ObservableIntAlias = Observable + +class A : ObservableAlias({}) +class B : ObservableIntAlias({}) diff --git a/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.txt b/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.txt new file mode 100644 index 00000000000..64f88595466 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.txt @@ -0,0 +1,31 @@ +package + +public final class A : ObservableAlias /* = Observable */ { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class B : ObservableIntAlias /* = Observable */ { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class Observable { + public constructor Observable(/*0*/ f: OnSubscribe!) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface OnSubscribe { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun f(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +public typealias ObservableAlias = Observable +public typealias ObservableIntAlias = Observable diff --git a/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.txt b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.txt index c0182593b26..753da0f5bdf 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.txt +++ b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.txt @@ -4,7 +4,6 @@ package test { public fun test(): kotlin.Unit public open class J { - public /*synthesized*/ constructor J(/*0*/ s: kotlin.String!, /*1*/ r: (() -> kotlin.Unit)!, /*2*/ z: kotlin.Boolean!) public constructor J(/*0*/ s: kotlin.String!, /*1*/ r: java.lang.Runnable!, /*2*/ z: kotlin.Boolean!) public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/platformTypes/samAdapterInConstructor.txt b/compiler/testData/diagnostics/tests/platformTypes/samAdapterInConstructor.txt index 7bbb3acd8e0..63369620f7f 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/samAdapterInConstructor.txt +++ b/compiler/testData/diagnostics/tests/platformTypes/samAdapterInConstructor.txt @@ -3,7 +3,6 @@ package public fun foo(): kotlin.Unit public open class A { - public /*synthesized*/ constructor A(/*0*/ comparator: ((E!, E!) -> kotlin.Int)!) public constructor A(/*0*/ comparator: java.util.Comparator!) public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.txt index f85e89a2c92..cbcfd0db1fd 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/Constructor.txt @@ -1,6 +1,5 @@ package test public open class Constructor { - public /*synthesized*/ constructor Constructor(/*0*/ p0: (() -> kotlin.Unit)!) public constructor Constructor(/*0*/ p0: java.lang.Runnable!) } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt index f0afe89c2fc..f142011b322 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/ConstructorWithAnnotations.txt @@ -1,6 +1,5 @@ package test public open class ConstructorWithAnnotations { - public /*synthesized*/ constructor ConstructorWithAnnotations(/*0*/ p0: (() -> kotlin.Unit)!, /*1*/ @org.jetbrains.annotations.NotNull p1: kotlin.String) public constructor ConstructorWithAnnotations(/*0*/ p0: java.lang.Runnable!, /*1*/ @org.jetbrains.annotations.NotNull p1: kotlin.String) } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index f960468bc2f..b82ff29b0fd 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -12268,6 +12268,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("typeAliasWithSamConstructor.kt") + public void testTypeAliasWithSamConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/typeAliasWithSamConstructor.kt"); + doTest(fileName); + } + @TestMetadata("UnboxingNulls.kt") public void testUnboxingNulls() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/UnboxingNulls.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt index 2ebd3f2a740..5ab0f045525 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -16,23 +16,13 @@ package org.jetbrains.kotlin.load.java.components -import org.jetbrains.kotlin.descriptors.ClassifierDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor import org.jetbrains.kotlin.types.SimpleType interface SamConversionResolver { companion object EMPTY : SamConversionResolver { - override fun resolveSamAdapter(original: D) = null - override fun resolveSamConstructor(constructorOwner: DeclarationDescriptor, classifier: () -> ClassifierDescriptor?) = null override fun resolveFunctionTypeIfSamInterface(classDescriptor: JavaClassDescriptor): SimpleType? = null } - fun resolveSamConstructor(constructorOwner: DeclarationDescriptor, classifier: () -> ClassifierDescriptor?): SamConstructorDescriptor? - - fun resolveSamAdapter(original: D): D? - fun resolveFunctionTypeIfSamInterface(classDescriptor: JavaClassDescriptor): SimpleType? } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java index 5f9dd8d67e3..d8d3f6671e5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaClassConstructorDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -18,7 +18,10 @@ package org.jetbrains.kotlin.load.java.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.ClassDescriptor; +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.kotlin.descriptors.FunctionDescriptor; +import org.jetbrains.kotlin.descriptors.SourceElement; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl; import org.jetbrains.kotlin.name.Name; @@ -135,5 +138,4 @@ public class JavaClassConstructorDescriptor extends ClassConstructorDescriptorIm return enhanced; } - } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 4b78ac69124..e5082713c25 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -58,7 +58,6 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.utils.SmartSet -import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.ifEmpty import java.util.* @@ -85,7 +84,6 @@ class LazyJavaClassMemberScope( for (constructor in constructors) { val descriptor = resolveConstructor(constructor) result.add(descriptor) - result.addIfNotNull(c.components.samConversionResolver.resolveSamAdapter(descriptor)) } enhanceSignatures( diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java index 22b63a70f05..074227865f4 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java index 760e9a55da5..9a641f42b64 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt index 789c903d3dc..fd9b39985c1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 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. diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SyntheticScopes.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SyntheticScopes.kt index 211ca7b9e2f..169abed3b2c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SyntheticScopes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SyntheticScopes.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.scopes +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.incremental.components.LookupLocation @@ -27,10 +28,14 @@ interface SyntheticScope { fun getSyntheticExtensionProperties(receiverTypes: Collection, name: Name, location: LookupLocation): Collection fun getSyntheticMemberFunctions(receiverTypes: Collection, name: Name, location: LookupLocation): Collection fun getSyntheticStaticFunctions(scope: ResolutionScope, name: Name, location: LookupLocation): Collection + fun getSyntheticConstructors(scope: ResolutionScope, name: Name, location: LookupLocation): Collection fun getSyntheticExtensionProperties(receiverTypes: Collection): Collection fun getSyntheticMemberFunctions(receiverTypes: Collection): Collection fun getSyntheticStaticFunctions(scope: ResolutionScope): Collection + fun getSyntheticConstructors(scope: ResolutionScope): Collection + + fun getSyntheticConstructor(constructor: ConstructorDescriptor): ConstructorDescriptor? } interface SyntheticScopes { @@ -51,6 +56,9 @@ fun SyntheticScopes.collectSyntheticMemberFunctions(receiverTypes: Collection) = scopes.flatMap { it.getSyntheticExtensionProperties(receiverTypes) } @@ -59,3 +67,9 @@ fun SyntheticScopes.collectSyntheticMemberFunctions(receiverTypes: Collection