From 08c9d1f7715166af88271b1e7f1dd62edc51c0cd Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 3 Feb 2017 17:21:00 +0100 Subject: [PATCH] attempt to fix KotlinXmlSerializerTest on Linux --- .../src/com/intellij/util/ReflectionUtil.java | 95 ++++++++++++------- .../util/xmlb/KotlinXmlSerializerTest.kt | 2 +- 2 files changed, 64 insertions(+), 33 deletions(-) diff --git a/platform/util/src/com/intellij/util/ReflectionUtil.java b/platform/util/src/com/intellij/util/ReflectionUtil.java index f5283c052ab6..b278e485b969 100644 --- a/platform/util/src/com/intellij/util/ReflectionUtil.java +++ b/platform/util/src/com/intellij/util/ReflectionUtil.java @@ -419,38 +419,9 @@ public class ReflectionUtil { return constructor.newInstance(); } catch (Exception e) { - // support Kotlin data classes - pass null as default value - for (Annotation annotation : aClass.getAnnotations()) { - String name = annotation.annotationType().getName(); - if (name.equals("kotlin.Metadata") || name.equals("kotlin.jvm.internal.KotlinClass")) { - Constructor[] constructors = aClass.getDeclaredConstructors(); - Exception exception = e; - ctorLoop: - for (Constructor constructor1 : constructors) { - try { - try { - constructor1.setAccessible(true); - } - catch (Throwable ignored) { } - - Class[] parameterTypes = constructor1.getParameterTypes(); - for (Class type : parameterTypes) { - if (type.getName().equals("kotlin.jvm.internal.DefaultConstructorMarker")) { - continue ctorLoop; - } - } - - @SuppressWarnings("unchecked") - T t = (T)constructor1.newInstance(new Object[parameterTypes.length]); - return t; - } - catch (Exception e1) { - exception = e1; - } - } - - ExceptionUtil.rethrow(exception); - } + T t = createAsDataClass(aClass); + if (t != null) { + return t; } ExceptionUtil.rethrow(e); @@ -461,6 +432,66 @@ public class ReflectionUtil { return null; } + @Nullable + private static T createAsDataClass(@NotNull Class aClass) { + // support Kotlin data classes - pass null as default value + for (Annotation annotation : aClass.getAnnotations()) { + String name = annotation.annotationType().getName(); + if (!name.equals("kotlin.Metadata") && !name.equals("kotlin.jvm.internal.KotlinClass")) { + continue; + } + + Constructor[] constructors = aClass.getDeclaredConstructors(); + Exception exception = null; + List> defaultCtors = new SmartList>(); + ctorLoop: + for (Constructor constructor : constructors) { + try { + try { + constructor.setAccessible(true); + } + catch (Throwable ignored) { + } + + Class[] parameterTypes = constructor.getParameterTypes(); + for (Class type : parameterTypes) { + if (type.getName().equals("kotlin.jvm.internal.DefaultConstructorMarker")) { + defaultCtors.add(constructor); + continue ctorLoop; + } + } + + //noinspection unchecked + return (T)constructor.newInstance(new Object[parameterTypes.length]); + } + catch (Exception e) { + exception = e; + } + } + + for (Constructor constructor : defaultCtors) { + try { + try { + constructor.setAccessible(true); + } + catch (Throwable ignored) { + } + + //noinspection unchecked + return (T)constructor.newInstance(); + } + catch (Exception e) { + exception = e; + } + } + + if (exception != null) { + ExceptionUtil.rethrow(exception); + } + } + return null; + } + @NotNull public static T createInstance(@NotNull Constructor constructor, @NotNull Object... args) { try { diff --git a/platform/util/testSrc/com/intellij/util/xmlb/KotlinXmlSerializerTest.kt b/platform/util/testSrc/com/intellij/util/xmlb/KotlinXmlSerializerTest.kt index ef624e25c4a9..e897fc0ce006 100644 --- a/platform/util/testSrc/com/intellij/util/xmlb/KotlinXmlSerializerTest.kt +++ b/platform/util/testSrc/com/intellij/util/xmlb/KotlinXmlSerializerTest.kt @@ -79,7 +79,7 @@ class KotlinXmlSerializerTest { } } -private enum class IgnorePolicy constructor(val text: String) { +private enum class IgnorePolicy(val text: String) { DEFAULT("Do not ignore"), TRIM_WHITESPACES("Trim whitespaces"), IGNORE_WHITESPACES("Ignore whitespaces"),