Support platformStatic for properties

#KT-5766 Fixed
This commit is contained in:
Michael Bogdanov
2014-11-14 15:48:45 +03:00
parent 5412a67d29
commit 2cc9d8e29b
24 changed files with 450 additions and 165 deletions
@@ -23,8 +23,6 @@ import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererM
import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.Renderer;
import static org.jetbrains.jet.lang.diagnostics.PositioningStrategies.DECLARATION_SIGNATURE;
public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
private static final Renderer<ConflictingJvmDeclarationsData> CONFLICTING_JVM_DECLARATIONS_DATA = new Renderer<ConflictingJvmDeclarationsData>() {
@@ -46,8 +44,8 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
static {
MAP.put(ErrorsJvm.CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: {0}", CONFLICTING_JVM_DECLARATIONS_DATA);
MAP.put(ErrorsJvm.ACCIDENTAL_OVERRIDE, "Accidental override: {0}", CONFLICTING_JVM_DECLARATIONS_DATA);
MAP.put(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT, "Only functions in named objects and class objects of classes can be annotated with ''platformStatic''", DescriptorRenderer.SHORT_NAMES_IN_TYPES);
MAP.put(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC, "Override cannot be ''platformStatic'' in object", DescriptorRenderer.SHORT_NAMES_IN_TYPES);
MAP.put(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT, "Only functions in named objects and class objects of classes can be annotated with ''platformStatic''");
MAP.put(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC, "Override cannot be ''platformStatic'' in object");
MAP.put(ErrorsJvm.PLATFORM_STATIC_ILLEGAL_USAGE, "This declaration does not support ''platformStatic''", DescriptorRenderer.SHORT_NAMES_IN_TYPES);
}
@@ -22,7 +22,6 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory0;
import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory1;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetElement;
import static org.jetbrains.jet.lang.diagnostics.PositioningStrategies.DECLARATION_SIGNATURE;
import static org.jetbrains.jet.lang.diagnostics.PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT;
@@ -35,8 +34,8 @@ public interface ErrorsJvm {
DiagnosticFactory1<PsiElement, ConflictingJvmDeclarationsData> ACCIDENTAL_OVERRIDE =
DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT);
DiagnosticFactory1<JetDeclaration, DeclarationDescriptor> OVERRIDE_CANNOT_BE_STATIC = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE);
DiagnosticFactory1<JetDeclaration, DeclarationDescriptor> PLATFORM_STATIC_NOT_IN_OBJECT = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE);
DiagnosticFactory0<JetDeclaration> OVERRIDE_CANNOT_BE_STATIC = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE);
DiagnosticFactory0<JetDeclaration> PLATFORM_STATIC_NOT_IN_OBJECT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE);
DiagnosticFactory1<JetDeclaration, DeclarationDescriptor> PLATFORM_STATIC_ILLEGAL_USAGE = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE);
@SuppressWarnings("UnusedDeclaration")
@@ -44,6 +44,7 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.resolve.annotations.hasIntrinsicAnnotation
import org.jetbrains.jet.lang.psi.JetPropertyAccessor
public object JavaDeclarationCheckerProvider : AdditionalCheckerProvider {
@@ -68,18 +69,10 @@ public class PlatformStaticAnnotationChecker : AnnotationChecker {
override fun check(declaration: JetDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink) {
if (descriptor.hasPlatformStaticAnnotation()) {
if (declaration is JetNamedFunction) {
val insideObject = DescriptorUtils.containerKindIs(descriptor, ClassKind.OBJECT)
val insideClassObject = DescriptorUtils.containerKindIs(descriptor, ClassKind.CLASS_OBJECT)
if (!insideObject && !(insideClassObject && DescriptorUtils.containerKindIs(descriptor.getContainingDeclaration()!!, ClassKind.CLASS))) {
diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(declaration, descriptor));
}
if (insideObject && declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) {
diagnosticHolder.report(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC.on(declaration, descriptor));
}
} else {
if (declaration is JetNamedFunction || declaration is JetProperty) {
checkDeclaration(declaration, descriptor, diagnosticHolder, declaration)
}
else {
//TODO: there should be general mechanism
diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_ILLEGAL_USAGE.on(declaration, descriptor));
}
@@ -88,14 +81,44 @@ public class PlatformStaticAnnotationChecker : AnnotationChecker {
if (declaration is JetProperty) {
val getter = declaration.getGetter()
if (getter != null) {
check(getter, (descriptor as PropertyDescriptor).getGetter()!!, diagnosticHolder)
val propertyGetterDescriptor = (descriptor as PropertyDescriptor).getGetter()!!
if (propertyGetterDescriptor.hasPlatformStaticAnnotation()) {
checkDeclaration(declaration, descriptor, diagnosticHolder, getter)
}
}
val setter = declaration.getSetter()
if (setter != null) {
check(setter, (descriptor as PropertyDescriptor).getSetter()!!, diagnosticHolder)
val propertySetterDescriptor = (descriptor as PropertyDescriptor).getSetter()!!
if (propertySetterDescriptor.hasPlatformStaticAnnotation()) {
checkDeclaration(declaration, descriptor, diagnosticHolder, setter)
}
}
}
}
private fun checkDeclaration(
declaration: JetDeclaration,
descriptor: DeclarationDescriptor,
diagnosticHolder: DiagnosticSink,
reportDiagnosticOn: JetDeclaration
) {
val insideObject = containerKindIs(descriptor, ClassKind.OBJECT)
val insideClassObject = containerKindIs(descriptor, ClassKind.CLASS_OBJECT)
if (!insideObject && !(insideClassObject && containerKindIs(descriptor.getContainingDeclaration()!!, ClassKind.CLASS))) {
diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(reportDiagnosticOn));
}
if (insideObject && declaration.hasModifier(JetTokens.OVERRIDE_KEYWORD)) {
diagnosticHolder.report(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC.on(reportDiagnosticOn));
}
}
private fun containerKindIs(descriptor: DeclarationDescriptor, kind: ClassKind): Boolean {
val parentDeclaration = descriptor.getContainingDeclaration()
return parentDeclaration != null && DescriptorUtils.isKindOf(parentDeclaration, kind)
}
}
public class ReifiedTypeParameterAnnotationChecker : AnnotationChecker {
@@ -21,6 +21,8 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor
import org.jetbrains.jet.lang.descriptors.ClassKind
public fun DeclarationDescriptor.hasInlineAnnotation(): Boolean {
return getAnnotations().findAnnotation(FqName("kotlin.inline")) != null
@@ -35,7 +37,17 @@ public fun DeclarationDescriptor.hasIntrinsicAnnotation(): Boolean {
}
public fun CallableDescriptor.isPlatformStaticInObject(): Boolean =
DescriptorUtils.isObject(getContainingDeclaration()) && hasPlatformStaticAnnotation()
isPlatformStaticIn(ClassKind.OBJECT)
public fun CallableDescriptor.isPlatformStaticInClassObject(): Boolean =
DescriptorUtils.isClassObject(getContainingDeclaration()) && hasPlatformStaticAnnotation()
isPlatformStaticIn(ClassKind.CLASS_OBJECT)
private fun CallableDescriptor.isPlatformStaticIn(kind: ClassKind): Boolean =
when (this) {
is PropertyAccessorDescriptor -> {
val propertyDescriptor = getCorrespondingProperty()
DescriptorUtils.isKindOf(propertyDescriptor.getContainingDeclaration(), kind) &&
(hasPlatformStaticAnnotation() || propertyDescriptor.hasPlatformStaticAnnotation())
}
else -> DescriptorUtils.isKindOf(getContainingDeclaration(), kind) && hasPlatformStaticAnnotation()
}
@@ -12,4 +12,8 @@ class Test {
return A.test3("JAVA");
}
public static String test4() {
return A.getC();
}
}
@@ -5,6 +5,8 @@ class A {
class object {
val b: String = "OK"
platformStatic val c: String = "OK"
platformStatic fun test1() = b
platformStatic fun test2() = b
@@ -20,5 +22,7 @@ fun box(): String {
if (Test.test3() != "JAVAOK") return "fail 3"
if (Test.test4() != "OK") return "fail 4"
return "OK"
}
@@ -12,4 +12,8 @@ class Test {
return A.test3("JAVA");
}
public static String test4() {
return A.getC();
}
}
@@ -4,6 +4,8 @@ object A {
val b: String = "OK"
platformStatic val c: String = "OK"
platformStatic fun test1() = b
platformStatic fun test2() = b
@@ -18,5 +20,7 @@ fun box(): String {
if (Test.test3() != "JAVAOK") return "fail 3"
if (Test.test4() != "OK") return "fail 4"
return "OK"
}
@@ -4,6 +4,8 @@ object A {
val b: String = "OK"
platformStatic val c: String = "OK"
platformStatic fun test1() : String {
return b
}
@@ -34,5 +36,7 @@ fun box(): String {
if (A.(A::test4)() != "1OK") return "fail 4"
if (((A::c).get(A)) != "OK") return "fail 5"
return "OK"
}
@@ -4,6 +4,8 @@ object A {
val b: String = "OK"
platformStatic val c: String = "OK"
platformStatic fun test1() : String {
return {b}()
}
@@ -23,6 +25,10 @@ object A {
platformStatic fun String.test5() : String {
return {this + b}()
}
fun test6(): String {
return {c}()
}
}
fun box(): String {
@@ -36,5 +42,7 @@ fun box(): String {
if (with(A) {"1".test5()} != "1OK") return "fail 5"
if (A.test6() != "OK") return "fail 6"
return "OK"
}
@@ -2,6 +2,8 @@ import kotlin.platform.platformStatic
object AX {
platformStatic val c: String = "OK"
platformStatic fun aStatic(): String {
return AX.b()
}
@@ -14,13 +16,19 @@ object AX {
return "OK"
}
fun getProperty(): String {
return AX.c
}
}
fun box() : String {
if (AX.aStatic() != "OK") return "fail 1"
if (AX.aNonStatic() != "OK") return "fail 1"
if (AX.aNonStatic() != "OK") return "fail 2"
if (AX.getProperty() != "OK") return "fail 3"
return "OK"
}
@@ -0,0 +1,11 @@
import kotlin.platform.platformStatic
object X {
platformStatic val x = "OK"
fun fn(value : String = x): String = value
}
fun box(): String {
return X.fn()
}
@@ -0,0 +1,31 @@
import kotlin.platform.platformStatic
object A {
platformStatic var a: Int = 1
var b: Int = 1
[platformStatic] get
var c: Int = 1
[platformStatic] set
}
fun box(): String {
if (A.test1() != "OK") return "fail 1"
if (A.test2() != "OK") return "fail 2"
if (A.test3() != "1OK") return "fail 3"
if (A.test4() != "1OK") return "fail 4"
if (with(A) {"1".test5()} != "1OK") return "fail 5"
if (A.c != "OK") return "fail 6"
return "OK"
}
@@ -4,6 +4,8 @@ object A {
val b: String = "OK"
platformStatic val c: String = "OK"
platformStatic fun test1() : String {
return b
}
@@ -36,5 +38,7 @@ fun box(): String {
if (with(A) {"1".test5()} != "1OK") return "fail 5"
if (A.c != "OK") return "fail 6"
return "OK"
}
@@ -0,0 +1,10 @@
package test;
class Test {
public static void main(String[] args) {
A.getB();
A.getC(new A());
}
}
@@ -0,0 +1,21 @@
package test
import kotlin.platform.platformStatic
class A {
class object {
[platformStatic] val b: String = "OK"
var A.c: String
[platformStatic] get() = "OK"
[platformStatic] set(t: String) {}
}
}
fun main(args: Array<String>) {
A.b
with(A) {
A().c
A().c = "123"
}
}
@@ -0,0 +1,10 @@
package test;
class Test {
public static void main(String[] args) {
A.getB();
A.getC(A.INSTANCE$);
}
}
@@ -0,0 +1,20 @@
package test
import kotlin.platform.platformStatic
object A {
[platformStatic] val b: String = "OK"
var A.c: String
[platformStatic]get() = "OK"
[platformStatic]set(t: String) {}
}
fun main(args: Array<String>) {
A.b
with(A) {
A.c
A.c = "123"
}
}
@@ -1,29 +1,44 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
import kotlin.platform.platformStatic
open class B {
public open val base1 : Int = 1
public open val base2 : Int = 1
}
class A {
class object {
class object : B() {
var p1:Int = 1
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] set(p: Int)<!> {
[platformStatic] set(p: Int) {
p1 = 1
}
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] val z<!> = 1;
[platformStatic] val z = 1;
[platformStatic] override val base1: Int = 0
override val base2: Int = 0
[platformStatic] get
}
object A {
object A : B() {
var p:Int = 1
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] set(p1: Int)<!> {
[platformStatic] set(p1: Int) {
p = 1
}
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] val z<!> = 1;
[platformStatic] val z = 1;
<!OVERRIDE_CANNOT_BE_STATIC!>[platformStatic] override val base1: Int<!> = 0
override val base2: Int = 0
<!OVERRIDE_CANNOT_BE_STATIC!>[platformStatic] get<!>
}
var p:Int = 1
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] set(p1: Int)<!> {
<!PLATFORM_STATIC_NOT_IN_OBJECT!>[platformStatic] set(p1: Int)<!> {
p = 1
}
<!PLATFORM_STATIC_ILLEGAL_USAGE!>[platformStatic] val z<!> = 1;
<!PLATFORM_STATIC_NOT_IN_OBJECT!>[platformStatic] val z2<!> = 1;
}
@@ -6,24 +6,20 @@ DescriptorResolver@3 {
<name not found> = IntValue@4
<name not found> = IntValue@5
<name not found> = IntValue@6
<name not found> = JetTypeImpl@7['Int']
<name not found> = JetTypeImpl@7['Int']
<name not found> = JetTypeImpl@7['Int']
<name not found> = IntValue@7
<name not found> = IntValue@8
<name not found> = IntValue@9
<name not found> = IntValue@10
<name not found> = IntValue@11
<name not found> = IntValue@12
<name not found> = JetTypeImpl@13['Int']
<name not found> = JetTypeImpl@13['Int']
<name not found> = JetTypeImpl@13['Int']
}
DeserializedClassDescriptor@2['platformStatic'] {
containingDeclaration = LazyJavaPackageFragment@8['platform']
primaryConstructor = ConstructorDescriptorImpl@9['<init>']
}
LazyAnnotationDescriptor@10 {
resolutionResults = OverloadResolutionResultsImpl@11
type = JetTypeImpl@12['platformStatic']
}
LazyAnnotationDescriptor@13 {
resolutionResults = OverloadResolutionResultsImpl@14
type = JetTypeImpl@15['platformStatic']
containingDeclaration = LazyJavaPackageFragment@14['platform']
primaryConstructor = ConstructorDescriptorImpl@15['<init>']
}
LazyAnnotationDescriptor@16 {
@@ -46,146 +42,211 @@ LazyAnnotationDescriptor@25 {
type = JetTypeImpl@27['platformStatic']
}
LazyJavaPackageFragmentProvider@28 {
packageFragments('<root>': FqName@29) = LazyJavaPackageFragment@30['<root>']
packageFragments('A': FqName@31) = null
packageFragments('Int': FqName@32) = null
packageFragments('java': FqName@33) = LazyJavaPackageFragment@34['java']
packageFragments('java.lang': FqName@35) = LazyJavaPackageFragment@36['lang']
packageFragments('java.lang.Int': FqName@37) = null
packageFragments('java.lang.platformStatic': FqName@38) = null
packageFragments('kotlin': FqName@39) = LazyJavaPackageFragment@40['kotlin']
packageFragments('kotlin.Int': FqName@41) = null
packageFragments('kotlin.io': FqName@42) = LazyJavaPackageFragment@43['io']
packageFragments('kotlin.io.Int': FqName@44) = null
packageFragments('kotlin.io.platformStatic': FqName@45) = null
packageFragments('kotlin.jvm': FqName@46) = LazyJavaPackageFragment@47['jvm']
packageFragments('kotlin.jvm.Int': FqName@48) = null
packageFragments('kotlin.jvm.platformStatic': FqName@49) = null
packageFragments('kotlin.platform': FqName@50) = LazyJavaPackageFragment@8['platform']
packageFragments('kotlin.platform.platformStatic': FqName@51) = null
packageFragments('kotlin.platformStatic': FqName@52) = null
packageFragments('platformStatic': FqName@53) = null
LazyAnnotationDescriptor@28 {
resolutionResults = OverloadResolutionResultsImpl@29
type = JetTypeImpl@30['platformStatic']
}
LazyJavaPackageFragment@30['<root>'] {
classes('Int': Name@54) = null // through LazyPackageFragmentScopeForJavaPackage@55
classes('kotlin': Name@56) = null // through LazyPackageFragmentScopeForJavaPackage@55
classes('p': Name@57) = null // through LazyPackageFragmentScopeForJavaPackage@55
classes('p1': Name@58) = null // through LazyPackageFragmentScopeForJavaPackage@55
classes('platformStatic': Name@59) = null // through LazyPackageFragmentScopeForJavaPackage@55
deserializedPackageScope = Empty@60 // through LazyPackageFragmentScopeForJavaPackage@55
functions('kotlin': Name@61) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@55
memberIndex = computeMemberIndex$1@63 // through LazyPackageFragmentScopeForJavaPackage@55
LazyAnnotationDescriptor@31 {
resolutionResults = OverloadResolutionResultsImpl@32
type = JetTypeImpl@33['platformStatic']
}
LazyJavaPackageFragment@43['io'] {
classes('Int': Name@54) = null // through LazyPackageFragmentScopeForJavaPackage@64
classes('p': Name@57) = null // through LazyPackageFragmentScopeForJavaPackage@64
classes('p1': Name@58) = null // through LazyPackageFragmentScopeForJavaPackage@64
deserializedPackageScope = DeserializedPackageMemberScope@65 // through LazyPackageFragmentScopeForJavaPackage@64
membersProtos = LinkedHashMap@66 // through DeserializedPackageMemberScope@65
properties('p': Name@57) = EmptyList@62[empty] // through DeserializedPackageMemberScope@65
properties('p1': Name@58) = EmptyList@62[empty] // through DeserializedPackageMemberScope@65
LazyAnnotationDescriptor@34 {
resolutionResults = OverloadResolutionResultsImpl@35
type = JetTypeImpl@36['platformStatic']
}
LazyJavaPackageFragment@34['java'] {
classes('lang': Name@67) = null // through LazyPackageFragmentScopeForJavaPackage@68
deserializedPackageScope = Empty@60 // through LazyPackageFragmentScopeForJavaPackage@68
functions('lang': Name@69) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@68
memberIndex = computeMemberIndex$1@70 // through LazyPackageFragmentScopeForJavaPackage@68
LazyAnnotationDescriptor@37 {
resolutionResults = OverloadResolutionResultsImpl@38
type = JetTypeImpl@39['platformStatic']
}
LazyJavaPackageFragment@47['jvm'] {
classes('Int': Name@54) = null // through LazyPackageFragmentScopeForJavaPackage@71
classes('p': Name@57) = null // through LazyPackageFragmentScopeForJavaPackage@71
classes('p1': Name@58) = null // through LazyPackageFragmentScopeForJavaPackage@71
deserializedPackageScope = Empty@60 // through LazyPackageFragmentScopeForJavaPackage@71
LazyAnnotationDescriptor@40 {
resolutionResults = OverloadResolutionResultsImpl@41
type = JetTypeImpl@42['platformStatic']
}
LazyJavaPackageFragment@40['kotlin'] {
classes('Int': Name@54) = null // through LazyPackageFragmentScopeForJavaPackage@72
classes('io': Name@73) = null // through LazyPackageFragmentScopeForJavaPackage@72
classes('jvm': Name@74) = null // through LazyPackageFragmentScopeForJavaPackage@72
classes('p': Name@57) = null // through LazyPackageFragmentScopeForJavaPackage@72
classes('p1': Name@58) = null // through LazyPackageFragmentScopeForJavaPackage@72
classes('platform': Name@75) = null // through LazyPackageFragmentScopeForJavaPackage@72
deserializedPackageScope = DeserializedPackageMemberScope@76 // through LazyPackageFragmentScopeForJavaPackage@72
functions('io': Name@77) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
functions('io': Name@77) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@72
functions('jvm': Name@78) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
functions('jvm': Name@78) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@72
functions('platform': Name@79) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
functions('platform': Name@79) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@72
memberIndex = computeMemberIndex$1@80 // through LazyPackageFragmentScopeForJavaPackage@72
membersProtos = LinkedHashMap@81 // through DeserializedPackageMemberScope@76
properties('io': Name@77) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
properties('jvm': Name@78) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
properties('p': Name@57) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
properties('p1': Name@58) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
properties('platform': Name@79) = EmptyList@62[empty] // through DeserializedPackageMemberScope@76
LazyAnnotationDescriptor@43 {
resolutionResults = OverloadResolutionResultsImpl@44
type = JetTypeImpl@45['platformStatic']
}
LazyJavaPackageFragment@36['lang'] {
classes('p': Name@57) = null // through LazyPackageFragmentScopeForJavaPackage@82
classes('p1': Name@58) = null // through LazyPackageFragmentScopeForJavaPackage@82
deserializedPackageScope = Empty@60 // through LazyPackageFragmentScopeForJavaPackage@82
LazyJavaPackageFragmentProvider@46 {
packageFragments('<root>': FqName@47) = LazyJavaPackageFragment@48['<root>']
packageFragments('A': FqName@49) = null
packageFragments('B': FqName@50) = null
packageFragments('Int': FqName@51) = null
packageFragments('java': FqName@52) = LazyJavaPackageFragment@53['java']
packageFragments('java.lang': FqName@54) = LazyJavaPackageFragment@55['lang']
packageFragments('java.lang.B': FqName@56) = null
packageFragments('java.lang.Int': FqName@57) = null
packageFragments('java.lang.platformStatic': FqName@58) = null
packageFragments('kotlin': FqName@59) = LazyJavaPackageFragment@60['kotlin']
packageFragments('kotlin.B': FqName@61) = null
packageFragments('kotlin.Int': FqName@62) = null
packageFragments('kotlin.io': FqName@63) = LazyJavaPackageFragment@64['io']
packageFragments('kotlin.io.B': FqName@65) = null
packageFragments('kotlin.io.Int': FqName@66) = null
packageFragments('kotlin.io.platformStatic': FqName@67) = null
packageFragments('kotlin.jvm': FqName@68) = LazyJavaPackageFragment@69['jvm']
packageFragments('kotlin.jvm.B': FqName@70) = null
packageFragments('kotlin.jvm.Int': FqName@71) = null
packageFragments('kotlin.jvm.platformStatic': FqName@72) = null
packageFragments('kotlin.platform': FqName@73) = LazyJavaPackageFragment@14['platform']
packageFragments('kotlin.platform.platformStatic': FqName@74) = null
packageFragments('kotlin.platformStatic': FqName@75) = null
packageFragments('platformStatic': FqName@76) = null
}
LazyJavaPackageFragment@8['platform'] {
classes('platformStatic': Name@83) = DeserializedClassDescriptor@2['platformStatic'] // through LazyPackageFragmentScopeForJavaPackage@84
deserializedPackageScope = Empty@60 // through LazyPackageFragmentScopeForJavaPackage@84
functions('platformStatic': Name@85) = EmptyList@62[empty] // through LazyPackageFragmentScopeForJavaPackage@84
memberIndex = computeMemberIndex$1@86 // through LazyPackageFragmentScopeForJavaPackage@84
LazyJavaPackageFragment@48['<root>'] {
classes('Int': Name@77) = null // through LazyPackageFragmentScopeForJavaPackage@78
classes('kotlin': Name@79) = null // through LazyPackageFragmentScopeForJavaPackage@78
classes('p': Name@80) = null // through LazyPackageFragmentScopeForJavaPackage@78
classes('p1': Name@81) = null // through LazyPackageFragmentScopeForJavaPackage@78
classes('platformStatic': Name@82) = null // through LazyPackageFragmentScopeForJavaPackage@78
deserializedPackageScope = Empty@83 // through LazyPackageFragmentScopeForJavaPackage@78
functions('kotlin': Name@84) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@78
memberIndex = computeMemberIndex$1@86 // through LazyPackageFragmentScopeForJavaPackage@78
}
ResolutionTaskHolder@87 {
<name not found> = ArrayList@88[1] { ResolutionCandidate@89 }
<name not found> = ArrayList@90[1] { ResolutionCandidate@89 }
<name not found> = EmptyList@62[empty]
<name not found> = EmptyList@62[empty]
LazyJavaPackageFragment@64['io'] {
classes('Int': Name@77) = null // through LazyPackageFragmentScopeForJavaPackage@87
classes('p': Name@80) = null // through LazyPackageFragmentScopeForJavaPackage@87
classes('p1': Name@81) = null // through LazyPackageFragmentScopeForJavaPackage@87
deserializedPackageScope = DeserializedPackageMemberScope@88 // through LazyPackageFragmentScopeForJavaPackage@87
membersProtos = LinkedHashMap@89 // through DeserializedPackageMemberScope@88
properties('p': Name@80) = EmptyList@85[empty] // through DeserializedPackageMemberScope@88
properties('p1': Name@81) = EmptyList@85[empty] // through DeserializedPackageMemberScope@88
}
ResolutionTaskHolder@91 {
<name not found> = ArrayList@92[1] { ResolutionCandidate@93 }
<name not found> = ArrayList@94[1] { ResolutionCandidate@93 }
<name not found> = EmptyList@62[empty]
<name not found> = EmptyList@62[empty]
LazyJavaPackageFragment@53['java'] {
classes('lang': Name@90) = null // through LazyPackageFragmentScopeForJavaPackage@91
deserializedPackageScope = Empty@83 // through LazyPackageFragmentScopeForJavaPackage@91
functions('lang': Name@92) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@91
memberIndex = computeMemberIndex$1@93 // through LazyPackageFragmentScopeForJavaPackage@91
}
ResolutionTaskHolder@95 {
<name not found> = ArrayList@96[1] { ResolutionCandidate@97 }
<name not found> = ArrayList@98[1] { ResolutionCandidate@97 }
<name not found> = EmptyList@62[empty]
<name not found> = EmptyList@62[empty]
LazyJavaPackageFragment@69['jvm'] {
classes('Int': Name@77) = null // through LazyPackageFragmentScopeForJavaPackage@94
classes('p': Name@80) = null // through LazyPackageFragmentScopeForJavaPackage@94
classes('p1': Name@81) = null // through LazyPackageFragmentScopeForJavaPackage@94
deserializedPackageScope = Empty@83 // through LazyPackageFragmentScopeForJavaPackage@94
}
ResolutionTaskHolder@99 {
<name not found> = ArrayList@100[1] { ResolutionCandidate@101 }
<name not found> = ArrayList@102[1] { ResolutionCandidate@101 }
LazyJavaPackageFragment@60['kotlin'] {
classes('Int': Name@77) = null // through LazyPackageFragmentScopeForJavaPackage@95
classes('io': Name@96) = null // through LazyPackageFragmentScopeForJavaPackage@95
classes('jvm': Name@97) = null // through LazyPackageFragmentScopeForJavaPackage@95
classes('p': Name@80) = null // through LazyPackageFragmentScopeForJavaPackage@95
classes('p1': Name@81) = null // through LazyPackageFragmentScopeForJavaPackage@95
classes('platform': Name@98) = null // through LazyPackageFragmentScopeForJavaPackage@95
deserializedPackageScope = DeserializedPackageMemberScope@99 // through LazyPackageFragmentScopeForJavaPackage@95
functions('io': Name@100) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
functions('io': Name@100) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@95
functions('jvm': Name@101) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
functions('jvm': Name@101) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@95
functions('platform': Name@102) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
functions('platform': Name@102) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@95
memberIndex = computeMemberIndex$1@103 // through LazyPackageFragmentScopeForJavaPackage@95
membersProtos = LinkedHashMap@104 // through DeserializedPackageMemberScope@99
properties('io': Name@100) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
properties('jvm': Name@101) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
properties('p': Name@80) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
properties('p1': Name@81) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
properties('platform': Name@102) = EmptyList@85[empty] // through DeserializedPackageMemberScope@99
}
ResolutionTaskHolder@103 {
<name not found> = ArrayList@104[1] { ResolutionCandidate@105 }
<name not found> = ArrayList@106[1] { ResolutionCandidate@105 }
LazyJavaPackageFragment@55['lang'] {
classes('p': Name@80) = null // through LazyPackageFragmentScopeForJavaPackage@105
classes('p1': Name@81) = null // through LazyPackageFragmentScopeForJavaPackage@105
deserializedPackageScope = Empty@83 // through LazyPackageFragmentScopeForJavaPackage@105
}
ResolutionTaskHolder@107 {
<name not found> = ArrayList@108[1] { ResolutionCandidate@109 }
<name not found> = ArrayList@110[1] { ResolutionCandidate@109 }
LazyJavaPackageFragment@14['platform'] {
classes('platformStatic': Name@106) = DeserializedClassDescriptor@2['platformStatic'] // through LazyPackageFragmentScopeForJavaPackage@107
deserializedPackageScope = Empty@83 // through LazyPackageFragmentScopeForJavaPackage@107
functions('platformStatic': Name@108) = EmptyList@85[empty] // through LazyPackageFragmentScopeForJavaPackage@107
memberIndex = computeMemberIndex$1@109 // through LazyPackageFragmentScopeForJavaPackage@107
}
ResolutionTaskHolder@111 {
<name not found> = ArrayList@112[1] { ResolutionCandidate@113 }
<name not found> = ArrayList@114[1] { ResolutionCandidate@113 }
ResolutionTaskHolder@110 {
<name not found> = ArrayList@111[1] { ResolutionCandidate@112 }
<name not found> = ArrayList@113[1] { ResolutionCandidate@112 }
<name not found> = EmptyList@85[empty]
<name not found> = EmptyList@85[empty]
}
ResolutionTaskHolder@115 {
<name not found> = ArrayList@116[1] { ResolutionCandidate@117 }
<name not found> = ArrayList@118[1] { ResolutionCandidate@117 }
ResolutionTaskHolder@114 {
<name not found> = ArrayList@115[1] { ResolutionCandidate@116 }
<name not found> = ArrayList@117[1] { ResolutionCandidate@116 }
<name not found> = EmptyList@85[empty]
<name not found> = EmptyList@85[empty]
}
ResolutionTaskHolder@119 {
<name not found> = ArrayList@120[1] { ResolutionCandidate@121 }
<name not found> = ArrayList@122[1] { ResolutionCandidate@121 }
ResolutionTaskHolder@118 {
<name not found> = ArrayList@119[1] { ResolutionCandidate@120 }
<name not found> = ArrayList@121[1] { ResolutionCandidate@120 }
<name not found> = EmptyList@85[empty]
<name not found> = EmptyList@85[empty]
}
ResolutionTaskHolder@122 {
<name not found> = ArrayList@123[1] { ResolutionCandidate@124 }
<name not found> = ArrayList@125[1] { ResolutionCandidate@124 }
}
ResolutionTaskHolder@126 {
<name not found> = ArrayList@127[1] { ResolutionCandidate@128 }
<name not found> = ArrayList@129[1] { ResolutionCandidate@128 }
}
ResolutionTaskHolder@130 {
<name not found> = ArrayList@131[1] { ResolutionCandidate@132 }
<name not found> = ArrayList@133[1] { ResolutionCandidate@132 }
}
ResolutionTaskHolder@134 {
<name not found> = ArrayList@135[1] { ResolutionCandidate@136 }
<name not found> = ArrayList@137[1] { ResolutionCandidate@136 }
}
ResolutionTaskHolder@138 {
<name not found> = ArrayList@139[1] { ResolutionCandidate@140 }
<name not found> = ArrayList@141[1] { ResolutionCandidate@140 }
}
ResolutionTaskHolder@142 {
<name not found> = ArrayList@143[1] { ResolutionCandidate@144 }
<name not found> = ArrayList@145[1] { ResolutionCandidate@144 }
}
ResolutionTaskHolder@146 {
<name not found> = ArrayList@147[1] { ResolutionCandidate@148 }
<name not found> = ArrayList@149[1] { ResolutionCandidate@148 }
}
ResolutionTaskHolder@150 {
<name not found> = ArrayList@151[1] { ResolutionCandidate@152 }
<name not found> = ArrayList@153[1] { ResolutionCandidate@152 }
}
ResolutionTaskHolder@154 {
<name not found> = ArrayList@155[1] { ResolutionCandidate@156 }
<name not found> = ArrayList@157[1] { ResolutionCandidate@156 }
}
ResolutionTaskHolder@158 {
<name not found> = ArrayList@159[1] { ResolutionCandidate@160 }
<name not found> = ArrayList@161[1] { ResolutionCandidate@160 }
}
ResolutionTaskHolder@162 {
<name not found> = ArrayList@163[1] { ResolutionCandidate@164 }
<name not found> = ArrayList@165[1] { ResolutionCandidate@164 }
}
ResolutionTaskHolder@166 {
<name not found> = ArrayList@167[1] { ResolutionCandidate@168 }
<name not found> = ArrayList@169[1] { ResolutionCandidate@168 }
}
@@ -3,13 +3,15 @@ package
internal final class A {
public constructor A()
internal final var p: kotlin.Int
kotlin.platform.platformStatic() internal final val z: kotlin.Int = 1
kotlin.platform.platformStatic() internal final val z2: kotlin.Int = 1
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
internal class object <class-object-for-A> {
internal class object <class-object-for-A> : B {
private constructor <class-object-for-A>()
kotlin.platform.platformStatic() public open override /*1*/ val base1: kotlin.Int = 0
public open override /*1*/ val base2: kotlin.Int = 0
internal final var p1: kotlin.Int
kotlin.platform.platformStatic() internal final val z: kotlin.Int = 1
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -17,8 +19,10 @@ internal final class A {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal object A {
internal object A : B {
private constructor A()
kotlin.platform.platformStatic() public open override /*1*/ val base1: kotlin.Int = 0
public open override /*1*/ val base2: kotlin.Int = 0
internal final var p: kotlin.Int
kotlin.platform.platformStatic() internal final val z: kotlin.Int = 1
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -27,6 +31,8 @@ internal final class A {
public class object <class-object-for-A> : A.A {
private constructor <class-object-for-A>()
kotlin.platform.platformStatic() public open override /*1*/ /*fake_override*/ val base1: kotlin.Int
public open override /*1*/ /*fake_override*/ val base2: kotlin.Int
internal final override /*1*/ /*fake_override*/ var p: kotlin.Int
kotlin.platform.platformStatic() internal final override /*1*/ /*fake_override*/ val z: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -35,3 +41,12 @@ internal final class A {
}
}
}
internal open class B {
public constructor B()
public open val base1: kotlin.Int = 1
public open val base2: kotlin.Int = 1
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
}
@@ -1664,6 +1664,18 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
doTestWithStdlib(fileName);
}
@TestMetadata("propertyAsDefault.kt")
public void testPropertyAsDefault() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/platformStatic/propertyAsDefault.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("propertyInc.kt")
public void testPropertyInc() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/platformStatic/propertyInc.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/platformStatic/simple.kt");
@@ -427,11 +427,23 @@ public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAg
doTest(fileName);
}
@TestMetadata("simpleClassObjectProperty.kt")
public void testSimpleClassObjectProperty() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/compileJavaAgainstKotlin/platformStatic/simpleClassObjectProperty.kt");
doTest(fileName);
}
@TestMetadata("simpleObject.kt")
public void testSimpleObject() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/compileJavaAgainstKotlin/platformStatic/simpleObject.kt");
doTest(fileName);
}
@TestMetadata("simpleObjectProperty.kt")
public void testSimpleObjectProperty() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/compileJavaAgainstKotlin/platformStatic/simpleObjectProperty.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/compileJavaAgainstKotlin/property")
@@ -266,11 +266,6 @@ public class DescriptorUtils {
return isKindOf(descriptor, ClassKind.CLASS);
}
public static boolean containerKindIs(@NotNull DeclarationDescriptor descriptor, @NotNull ClassKind kind) {
DeclarationDescriptor parentDeclaration = descriptor.getContainingDeclaration();
return parentDeclaration != null && isKindOf(parentDeclaration, kind);
}
public static boolean isKindOf(@Nullable DeclarationDescriptor descriptor, @NotNull ClassKind classKind) {
return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == classKind;
}