From e9a7a909f6227e0e67ae8956231ddeea149345e6 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 7 Mar 2012 12:08:55 +0400 Subject: [PATCH] KT-1402 Create new Kotlin object from a Java public static inner class --- .../resolve/java/JavaDescriptorResolver.java | 7 ++--- .../ConstructorDescriptorImpl.java | 7 ++++- .../testData/diagnostics/tests/j+k/kt1402.jet | 27 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/kt1402.jet diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index e90346e38db..3400964075b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -328,6 +328,7 @@ public class JavaDescriptorResolver { PsiMethod[] psiConstructors = psiClass.getConstructors(); + boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC); if (psiConstructors.length == 0) { // We need to create default constructors for classes and abstract classes. // Example: @@ -338,7 +339,7 @@ public class JavaDescriptorResolver { classData.classDescriptor, Collections.emptyList(), false); - constructorDescriptor.initialize(typeParameters, Collections.emptyList(), classData.classDescriptor.getVisibility()); + constructorDescriptor.initialize(typeParameters, Collections.emptyList(), classData.classDescriptor.getVisibility(), isStatic); constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType()); classData.classDescriptor.addConstructor(constructorDescriptor, null); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); @@ -379,7 +380,7 @@ public class JavaDescriptorResolver { } } - constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility()); + constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic); constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType()); classData.classDescriptor.addConstructor(constructorDescriptor, null); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); @@ -405,7 +406,7 @@ public class JavaDescriptorResolver { throw new IllegalStateException(); } constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors, - resolveVisibilityFromPsiModifiers(psiConstructor)); + resolveVisibilityFromPsiModifiers(psiConstructor), isStatic); constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType()); classData.classDescriptor.addConstructor(constructorDescriptor, null); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java index a7d5f9495c5..31482d43d18 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java @@ -46,7 +46,12 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements } public ConstructorDescriptorImpl initialize(@NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, Visibility visibility) { - super.initialize(null, getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL, visibility); + return initialize(typeParameters, unsubstitutedValueParameters, visibility, false); + } + + //isStatic - for java only + public ConstructorDescriptorImpl initialize(@NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, Visibility visibility, boolean isStatic) { + super.initialize(null, isStatic ? ReceiverDescriptor.NO_RECEIVER : getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL, visibility); return this; } diff --git a/compiler/testData/diagnostics/tests/j+k/kt1402.jet b/compiler/testData/diagnostics/tests/j+k/kt1402.jet new file mode 100644 index 00000000000..e373a79fa02 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/kt1402.jet @@ -0,0 +1,27 @@ +// FILE: a/M.java +// +JDK +package a; + +public class M { + public static class Inner { + private int i; + public Inner(int i) { + this.i = i; + } + + public int getI() { + return i; + } + } +} + +// FILE: b.kt +package b + +import a.M.Inner + +fun foo() { + doSmth(Inner(87)) +} + +fun doSmth(b: Inner) = b