Report incomplete hierarchy error for deserialized types
#KT-5129 Fixed Delete a JPS test that was specifically testing that we would not fail in this situation; now there's a compilation error
This commit is contained in:
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
public open class Super {
|
||||||
|
public fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class Sub : Super()
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
|
||||||
|
class test.Sub, unresolved supertypes: test.Super
|
||||||
|
|
||||||
|
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyInKotlin/source.kt:5:22: error: unresolved reference: foo
|
||||||
|
fun bar() = SubSub().foo()
|
||||||
|
^
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
import test.Sub
|
||||||
|
|
||||||
|
class SubSub : Sub()
|
||||||
|
|
||||||
|
fun bar() = SubSub().foo()
|
||||||
+22
-3
@@ -244,6 +244,22 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
|
|||||||
JetTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), output);
|
JetTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testIncompleteHierarchyInKotlin() throws Exception {
|
||||||
|
// Analogous to testIncompleteHierarchyInJava, but with a Kotlin library
|
||||||
|
|
||||||
|
File library = copyJarFileWithoutEntry(compileLibrary("library"), "test/Super.class");
|
||||||
|
|
||||||
|
File source = new File(getTestDataDirectory(), "source.kt");
|
||||||
|
|
||||||
|
Pair<String, ExitCode> pair = CliBaseTest.executeCompilerGrabOutput(new K2JVMCompiler(), Arrays.asList(
|
||||||
|
source.getPath(),
|
||||||
|
"-classpath", library.getPath(),
|
||||||
|
"-d", tmpdir.getPath()
|
||||||
|
));
|
||||||
|
|
||||||
|
JetTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), pair.first);
|
||||||
|
}
|
||||||
|
|
||||||
/*test source mapping generation when source info is absent*/
|
/*test source mapping generation when source info is absent*/
|
||||||
public void testInlineFunWithoutDebugInfo() throws Exception {
|
public void testInlineFunWithoutDebugInfo() throws Exception {
|
||||||
File inlineSource = new File(getTestDataDirectory(), "sourceInline.kt");
|
File inlineSource = new File(getTestDataDirectory(), "sourceInline.kt");
|
||||||
@@ -265,7 +281,8 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
|
|||||||
//skip debug info
|
//skip debug info
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
is.close();
|
is.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +316,8 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
|
|||||||
debugInfo.set(debug);
|
debugInfo.set(debug);
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
} finally {
|
}
|
||||||
|
finally {
|
||||||
resultStream.close();
|
resultStream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,7 +334,8 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
|
|||||||
|
|
||||||
if (InlineCodegenUtil.GENERATE_SMAP) {
|
if (InlineCodegenUtil.GENERATE_SMAP) {
|
||||||
assertEquals(expected, debugInfo.get());
|
assertEquals(expected, debugInfo.get());
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
assertEquals(null, debugInfo.get());
|
assertEquals(null, debugInfo.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|||||||
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
|
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolverImpl
|
import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolverImpl
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
@@ -30,7 +31,8 @@ public class DeserializationComponentsForJava(
|
|||||||
moduleDescriptor: ModuleDescriptor,
|
moduleDescriptor: ModuleDescriptor,
|
||||||
classDataFinder: JavaClassDataFinder,
|
classDataFinder: JavaClassDataFinder,
|
||||||
annotationAndConstantLoader: BinaryClassAnnotationAndConstantLoaderImpl,
|
annotationAndConstantLoader: BinaryClassAnnotationAndConstantLoaderImpl,
|
||||||
packageFragmentProvider: LazyJavaPackageFragmentProvider
|
packageFragmentProvider: LazyJavaPackageFragmentProvider,
|
||||||
|
errorReporter: ErrorReporter
|
||||||
) {
|
) {
|
||||||
val components: DeserializationComponents
|
val components: DeserializationComponents
|
||||||
|
|
||||||
@@ -38,7 +40,8 @@ public class DeserializationComponentsForJava(
|
|||||||
val localClassResolver = LocalClassResolverImpl()
|
val localClassResolver = LocalClassResolverImpl()
|
||||||
components = DeserializationComponents(
|
components = DeserializationComponents(
|
||||||
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
||||||
localClassResolver, JavaFlexibleTypeCapabilitiesDeserializer, ClassDescriptorFactory.EMPTY, JavaTypeCapabilitiesLoader
|
localClassResolver, errorReporter, JavaFlexibleTypeCapabilitiesDeserializer, ClassDescriptorFactory.EMPTY,
|
||||||
|
JavaTypeCapabilitiesLoader
|
||||||
)
|
)
|
||||||
localClassResolver.setDeserializationComponents(components)
|
localClassResolver.setDeserializationComponents(components)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -64,7 +64,10 @@ public class RuntimeModuleData private constructor(public val deserialization: D
|
|||||||
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, module)
|
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, module)
|
||||||
val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver)
|
val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver)
|
||||||
val binaryClassAnnotationAndConstantLoader = BinaryClassAnnotationAndConstantLoaderImpl(module, storageManager, reflectKotlinClassFinder, RuntimeErrorReporter)
|
val binaryClassAnnotationAndConstantLoader = BinaryClassAnnotationAndConstantLoaderImpl(module, storageManager, reflectKotlinClassFinder, RuntimeErrorReporter)
|
||||||
val deserializationComponentsForJava = DeserializationComponentsForJava(storageManager, module, javaClassDataFinder, binaryClassAnnotationAndConstantLoader, lazyJavaPackageFragmentProvider)
|
val deserializationComponentsForJava = DeserializationComponentsForJava(
|
||||||
|
storageManager, module, javaClassDataFinder, binaryClassAnnotationAndConstantLoader,
|
||||||
|
lazyJavaPackageFragmentProvider, RuntimeErrorReporter
|
||||||
|
)
|
||||||
singleModuleClassResolver.resolver = javaDescriptorResolver
|
singleModuleClassResolver.resolver = javaDescriptorResolver
|
||||||
deserializedDescriptorResolver.setComponents(deserializationComponentsForJava)
|
deserializedDescriptorResolver.setComponents(deserializationComponentsForJava)
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public fun createBuiltInPackageFragmentProvider(
|
|||||||
BuiltInsAnnotationAndConstantLoader(module),
|
BuiltInsAnnotationAndConstantLoader(module),
|
||||||
provider,
|
provider,
|
||||||
localClassResolver,
|
localClassResolver,
|
||||||
|
ErrorReporter.DO_NOTHING,
|
||||||
FlexibleTypeCapabilitiesDeserializer.ThrowException,
|
FlexibleTypeCapabilitiesDeserializer.ThrowException,
|
||||||
classDescriptorFactory
|
classDescriptorFactory
|
||||||
)
|
)
|
||||||
|
|||||||
+7
-2
@@ -57,7 +57,12 @@ class DeserializedType(
|
|||||||
|
|
||||||
override fun getCapabilities() = c.components.typeCapabilitiesLoader.loadCapabilities(typeProto)
|
override fun getCapabilities() = c.components.typeCapabilitiesLoader.loadCapabilities(typeProto)
|
||||||
|
|
||||||
private fun <E: Any> List<E>.getOrNull(index: Int): E? {
|
fun getPresentableText(): String {
|
||||||
return if (index in indices) this[index] else null
|
val typeConstructorData = typeProto.getTypeConstructorData()
|
||||||
|
val id = typeConstructorData.id
|
||||||
|
return if (typeConstructorData.kind == TypeConstructorKind.CLASS)
|
||||||
|
c.nameResolver.getClassId(id).asSingleFqName().asString()
|
||||||
|
else
|
||||||
|
"Unknown type parameter $id"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
@@ -32,4 +32,24 @@ public interface ErrorReporter {
|
|||||||
void reportCannotInferVisibility(@NotNull CallableMemberDescriptor descriptor);
|
void reportCannotInferVisibility(@NotNull CallableMemberDescriptor descriptor);
|
||||||
|
|
||||||
void reportLoadingError(@NotNull String message, @Nullable Exception exception);
|
void reportLoadingError(@NotNull String message, @Nullable Exception exception);
|
||||||
|
|
||||||
|
ErrorReporter DO_NOTHING = new ErrorReporter() {
|
||||||
|
@Override
|
||||||
|
public void reportIncompatibleAbiVersion(
|
||||||
|
@NotNull ClassId classId, @NotNull String filePath, @NotNull BinaryVersion actualVersion
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reportIncompleteHierarchy(@NotNull ClassDescriptor descriptor, @NotNull List<String> unresolvedSuperClasses) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reportCannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reportLoadingError(@NotNull String message, @Nullable Exception exception) {
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public class DeserializationComponents(
|
|||||||
public val annotationAndConstantLoader: AnnotationAndConstantLoader<AnnotationDescriptor, ConstantValue<*>, AnnotationWithTarget>,
|
public val annotationAndConstantLoader: AnnotationAndConstantLoader<AnnotationDescriptor, ConstantValue<*>, AnnotationWithTarget>,
|
||||||
public val packageFragmentProvider: PackageFragmentProvider,
|
public val packageFragmentProvider: PackageFragmentProvider,
|
||||||
public val localClassResolver: LocalClassResolver,
|
public val localClassResolver: LocalClassResolver,
|
||||||
|
public val errorReporter: ErrorReporter,
|
||||||
public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer,
|
public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer,
|
||||||
public val fictitiousClassDescriptorFactory: ClassDescriptorFactory,
|
public val fictitiousClassDescriptorFactory: ClassDescriptorFactory,
|
||||||
public val typeCapabilitiesLoader: TypeCapabilitiesLoader = TypeCapabilitiesLoader.NONE
|
public val typeCapabilitiesLoader: TypeCapabilitiesLoader = TypeCapabilitiesLoader.NONE
|
||||||
|
|||||||
+25
-16
@@ -32,11 +32,14 @@ import org.jetbrains.kotlin.serialization.Flags
|
|||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization
|
import org.jetbrains.kotlin.serialization.deserialization
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationContext
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializationContext
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializedType
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||||
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor
|
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor
|
||||||
import org.jetbrains.kotlin.types.JetType
|
import org.jetbrains.kotlin.types.JetType
|
||||||
|
import org.jetbrains.kotlin.types.upperIfFlexible
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
||||||
|
import org.jetbrains.kotlin.utils.toReadOnlyList
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
public class DeserializedClassDescriptor(
|
public class DeserializedClassDescriptor(
|
||||||
@@ -132,12 +135,25 @@ public class DeserializedClassDescriptor(
|
|||||||
|
|
||||||
override fun getCompanionObjectDescriptor(): ClassDescriptor? = companionObjectDescriptor()
|
override fun getCompanionObjectDescriptor(): ClassDescriptor? = companionObjectDescriptor()
|
||||||
|
|
||||||
private fun computeSuperTypes(): Collection<JetType> {
|
private fun computeSupertypes(): Collection<JetType> {
|
||||||
val supertypes = ArrayList<JetType>(classProto.getSupertypeCount())
|
val result = ArrayList<JetType>(classProto.supertypeCount)
|
||||||
for (supertype in classProto.getSupertypeList()) {
|
val unresolved = ArrayList<DeserializedType>(0)
|
||||||
supertypes.add(c.typeDeserializer.type(supertype))
|
|
||||||
|
for (supertypeProto in classProto.supertypeList) {
|
||||||
|
val supertype = c.typeDeserializer.type(supertypeProto)
|
||||||
|
if (supertype.isError) {
|
||||||
|
unresolved.add(supertype.upperIfFlexible() as? DeserializedType ?: error("Not a deserialized type: $supertype"))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result.add(supertype)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return supertypes
|
|
||||||
|
if (unresolved.isNotEmpty()) {
|
||||||
|
c.components.errorReporter.reportIncompleteHierarchy(this, unresolved.map(DeserializedType::getPresentableText))
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toReadOnlyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun hasNestedClass(name: Name): Boolean {
|
internal fun hasNestedClass(name: Name): Boolean {
|
||||||
@@ -149,20 +165,13 @@ public class DeserializedClassDescriptor(
|
|||||||
override fun getSource() = sourceElement
|
override fun getSource() = sourceElement
|
||||||
|
|
||||||
private inner class DeserializedClassTypeConstructor : AbstractClassTypeConstructor() {
|
private inner class DeserializedClassTypeConstructor : AbstractClassTypeConstructor() {
|
||||||
private val supertypes = computeSuperTypes()
|
private val supertypes = c.storageManager.createLazyValue {
|
||||||
|
computeSupertypes()
|
||||||
|
}
|
||||||
|
|
||||||
override fun getParameters() = c.typeDeserializer.ownTypeParameters
|
override fun getParameters() = c.typeDeserializer.ownTypeParameters
|
||||||
|
|
||||||
override fun getSupertypes(): Collection<JetType> {
|
override fun getSupertypes() = supertypes()
|
||||||
// We cannot have error supertypes because subclasses inherit error functions from them
|
|
||||||
// Filtering right away means copying the list every time, so we check for the rare condition first, and only then filter
|
|
||||||
for (supertype in supertypes) {
|
|
||||||
if (supertype.isError()) {
|
|
||||||
return supertypes.filter { !it.isError() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return supertypes
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isFinal() = !getModality().isOverridable()
|
override fun isFinal() = !getModality().isOverridable()
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|||||||
import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl
|
import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl
|
||||||
import org.jetbrains.kotlin.load.kotlin.JavaFlexibleTypeCapabilitiesDeserializer
|
import org.jetbrains.kotlin.load.kotlin.JavaFlexibleTypeCapabilitiesDeserializer
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
|
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
|
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
||||||
@@ -46,12 +45,15 @@ public class DeserializerForDecompiler(
|
|||||||
|
|
||||||
override val classDataFinder = DirectoryBasedDataFinder(classFinder, LOG)
|
override val classDataFinder = DirectoryBasedDataFinder(classFinder, LOG)
|
||||||
|
|
||||||
|
private val errorReporter = LoggingErrorReporter(LOG)
|
||||||
|
|
||||||
override val annotationAndConstantLoader =
|
override val annotationAndConstantLoader =
|
||||||
BinaryClassAnnotationAndConstantLoaderImpl(moduleDescriptor, storageManager, classFinder, LoggingErrorReporter(LOG))
|
BinaryClassAnnotationAndConstantLoaderImpl(moduleDescriptor, storageManager, classFinder, errorReporter)
|
||||||
|
|
||||||
override val deserializationComponents: DeserializationComponents = DeserializationComponents(
|
override val deserializationComponents: DeserializationComponents = DeserializationComponents(
|
||||||
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
||||||
ResolveEverythingToKotlinAnyLocalClassResolver, JavaFlexibleTypeCapabilitiesDeserializer, ClassDescriptorFactory.EMPTY
|
ResolveEverythingToKotlinAnyLocalClassResolver, errorReporter, JavaFlexibleTypeCapabilitiesDeserializer,
|
||||||
|
ClassDescriptorFactory.EMPTY
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun resolveDeclarationsInFacade(facadeFqName: FqName): Collection<DeclarationDescriptor> {
|
override fun resolveDeclarationsInFacade(facadeFqName: FqName): Collection<DeclarationDescriptor> {
|
||||||
|
|||||||
+5
-8
@@ -20,13 +20,9 @@ import com.intellij.openapi.diagnostic.Logger
|
|||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.decompiler.navigation.JsMetaFileUtils
|
import org.jetbrains.kotlin.idea.decompiler.navigation.JsMetaFileUtils
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
|
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory
|
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptAnnotationAndConstantLoader
|
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptAnnotationAndConstantLoader
|
||||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializedResourcePaths
|
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializedResourcePaths
|
||||||
@@ -41,7 +37,7 @@ public class KotlinJavaScriptDeserializerForDecompiler(
|
|||||||
val moduleDirectory = JsMetaFileUtils.getModuleDirectory(packageDirectory)
|
val moduleDirectory = JsMetaFileUtils.getModuleDirectory(packageDirectory)
|
||||||
val stringsFileName = KotlinJavascriptSerializedResourcePaths.getStringTableFilePath(directoryPackageFqName)
|
val stringsFileName = KotlinJavascriptSerializedResourcePaths.getStringTableFilePath(directoryPackageFqName)
|
||||||
val stringsFile = moduleDirectory.findFileByRelativePath(stringsFileName)
|
val stringsFile = moduleDirectory.findFileByRelativePath(stringsFileName)
|
||||||
assert(stringsFile != null, "strings file not found: $stringsFileName")
|
assert(stringsFile != null) { "strings file not found: $stringsFileName" }
|
||||||
NameResolver.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false)))
|
NameResolver.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +49,8 @@ public class KotlinJavaScriptDeserializerForDecompiler(
|
|||||||
|
|
||||||
override val deserializationComponents = DeserializationComponents(
|
override val deserializationComponents = DeserializationComponents(
|
||||||
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
|
||||||
ResolveEverythingToKotlinAnyLocalClassResolver, FlexibleTypeCapabilitiesDeserializer.Dynamic, ClassDescriptorFactory.EMPTY
|
ResolveEverythingToKotlinAnyLocalClassResolver, ErrorReporter.DO_NOTHING, FlexibleTypeCapabilitiesDeserializer.Dynamic,
|
||||||
|
ClassDescriptorFactory.EMPTY
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun resolveDeclarationsInFacade(facadeFqName: FqName): Collection<DeclarationDescriptor> {
|
override fun resolveDeclarationsInFacade(facadeFqName: FqName): Collection<DeclarationDescriptor> {
|
||||||
@@ -80,6 +77,6 @@ public class KotlinJavaScriptDeserializerForDecompiler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val LOG = Logger.getInstance(javaClass<KotlinJavaScriptDeserializerForDecompiler>())
|
private val LOG = Logger.getInstance(KotlinJavaScriptDeserializerForDecompiler::class.java)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,54 +25,11 @@ import org.jetbrains.kotlin.test.JetTestUtils
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
public class SimpleKotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
public class SimpleKotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||||
|
|
||||||
override fun setUp() {
|
override fun setUp() {
|
||||||
super.setUp()
|
super.setUp()
|
||||||
workDir = JetTestUtils.tmpDirForTest(this)
|
workDir = JetTestUtils.tmpDirForTest(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun testThreeModulesNoReexport() {
|
|
||||||
val aFile = createFile("a/a.kt",
|
|
||||||
"""
|
|
||||||
trait A1 {
|
|
||||||
fun bar()
|
|
||||||
}
|
|
||||||
trait A2 {
|
|
||||||
fun bar()
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
val a = addModule("a", PathUtil.getParentPath(aFile))
|
|
||||||
|
|
||||||
val bFile = createFile("b/b.kt",
|
|
||||||
"""
|
|
||||||
trait B1 {
|
|
||||||
fun foo(): B2? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
trait B2 : A1, A2 {
|
|
||||||
override fun bar() {}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
val b = addModule("b", PathUtil.getParentPath(bFile))
|
|
||||||
JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(
|
|
||||||
b.getDependenciesList().addModuleDependency(a)
|
|
||||||
).setExported(false)
|
|
||||||
|
|
||||||
val cFile = createFile("c/c.kt",
|
|
||||||
"""
|
|
||||||
class C : B1 {
|
|
||||||
fun test() {
|
|
||||||
foo()?.bar()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
val c = addModule("c", PathUtil.getParentPath(cFile))
|
|
||||||
c.getDependenciesList().addModuleDependency(b)
|
|
||||||
|
|
||||||
addKotlinRuntimeDependency()
|
|
||||||
rebuildAll()
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun testLoadingKotlinFromDifferentModules() {
|
public fun testLoadingKotlinFromDifferentModules() {
|
||||||
val aFile = createFile("m1/K.kt",
|
val aFile = createFile("m1/K.kt",
|
||||||
"""
|
"""
|
||||||
@@ -102,21 +59,21 @@ public class SimpleKotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
|||||||
""")
|
""")
|
||||||
val b = addModule("b", PathUtil.getParentPath(bFile))
|
val b = addModule("b", PathUtil.getParentPath(bFile))
|
||||||
JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(
|
JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(
|
||||||
b.getDependenciesList().addModuleDependency(a)
|
b.dependenciesList.addModuleDependency(a)
|
||||||
).setExported(false)
|
).isExported = false
|
||||||
|
|
||||||
addKotlinRuntimeDependency()
|
addKotlinRuntimeDependency()
|
||||||
rebuildAll()
|
rebuildAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun testThreeModulesNoReexportWithDaemon() {
|
public fun testDaemon() {
|
||||||
System.setProperty(COMPILE_DAEMON_ENABLED_PROPERTY,"")
|
System.setProperty(COMPILE_DAEMON_ENABLED_PROPERTY,"")
|
||||||
System.setProperty(COMPILE_DAEMON_VERBOSE_REPORT_PROPERTY, "")
|
System.setProperty(COMPILE_DAEMON_VERBOSE_REPORT_PROPERTY, "")
|
||||||
// spaces in the name to test proper file name handling
|
// spaces in the name to test proper file name handling
|
||||||
val flagFile = File.createTempFile("kotlin-jps - tests-", "-is-running");
|
val flagFile = File.createTempFile("kotlin-jps - tests-", "-is-running");
|
||||||
try {
|
try {
|
||||||
System.setProperty(COMPILE_DAEMON_CLIENT_ALIVE_PATH_PROPERTY, flagFile.absolutePath)
|
System.setProperty(COMPILE_DAEMON_CLIENT_ALIVE_PATH_PROPERTY, flagFile.absolutePath)
|
||||||
testThreeModulesNoReexport()
|
testLoadingKotlinFromDifferentModules()
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
flagFile.delete()
|
flagFile.delete()
|
||||||
|
|||||||
+1
@@ -44,6 +44,7 @@ public fun createKotlinJavascriptPackageFragmentProvider(
|
|||||||
KotlinJavascriptAnnotationAndConstantLoader(module),
|
KotlinJavascriptAnnotationAndConstantLoader(module),
|
||||||
provider,
|
provider,
|
||||||
localClassResolver,
|
localClassResolver,
|
||||||
|
ErrorReporter.DO_NOTHING,
|
||||||
FlexibleTypeCapabilitiesDeserializer.Dynamic,
|
FlexibleTypeCapabilitiesDeserializer.Dynamic,
|
||||||
ClassDescriptorFactory.EMPTY
|
ClassDescriptorFactory.EMPTY
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user