All regeneration infos moved to one file

This commit is contained in:
Michael Bogdanov
2016-03-11 14:21:30 +03:00
parent 56d8e4d170
commit c062fff633
2 changed files with 59 additions and 76 deletions
@@ -1,61 +0,0 @@
/*
* Copyright 2010-2015 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.codegen.inline
import java.util.*
class AnonymousObjectRegenerationInfo internal constructor(
override val oldClassName: String,
private val needReification: Boolean,
val lambdasToInline: Map<Int, LambdaInfo>,
private val capturedOuterRegenerated: Boolean,
private val alreadyRegenerated: Boolean,
val constructorDesc: String?,
private val isStaticOrigin: Boolean,
private val nameGenerator: NameGenerator) : RegenerationInfo() {
override val newClassName: String by lazy {
nameGenerator.genLambdaClassName()
}
var newConstructorDescriptor: String? = null
var allRecapturedParameters: List<CapturedParamDesc>? = null
var capturedLambdasToInline: Map<String, LambdaInfo>? = null
constructor(
ownerInternalName: String,
needReification: Boolean,
alreadyRegenerated: Boolean,
isStaticOrigin: Boolean,
nameGenerator: NameGenerator
) : this(
ownerInternalName, needReification,
HashMap<Int, LambdaInfo>(), false, alreadyRegenerated, null, isStaticOrigin, nameGenerator) {
}
override fun shouldRegenerate(sameModule: Boolean): Boolean {
return !alreadyRegenerated && (!lambdasToInline.isEmpty() || !sameModule || capturedOuterRegenerated || needReification)
}
override fun canRemoveAfterTransformation(): Boolean {
// Note: It is unsafe to remove anonymous class that is referenced by GETSTATIC within lambda
// because it can be local function from outer scope
return !isStaticOrigin
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
* Copyright 2010-2015 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,29 +16,73 @@
package org.jetbrains.kotlin.codegen.inline
import java.util.*
abstract class RegenerationInfo() {
abstract val oldClassName: String
abstract val oldClassName: String
abstract val newClassName: String
abstract val newClassName: String
abstract fun shouldRegenerate(sameModule: Boolean): Boolean
abstract fun shouldRegenerate(sameModule: Boolean): Boolean
abstract fun canRemoveAfterTransformation(): Boolean
abstract fun canRemoveAfterTransformation(): Boolean
}
class WhenMappingRegenerationInfo(override val oldClassName: String, val nameGenerator: NameGenerator) : RegenerationInfo() {
override val newClassName by lazy {
nameGenerator.genLambdaClassName() + oldClassName.substringAfterLast("/")
}
override val newClassName by lazy {
nameGenerator.genLambdaClassName() + oldClassName.substringAfterLast("/")
}
override fun shouldRegenerate(sameModule: Boolean): Boolean {
throw UnsupportedOperationException()
}
override fun shouldRegenerate(sameModule: Boolean): Boolean {
throw UnsupportedOperationException()
}
override fun canRemoveAfterTransformation(): Boolean {
return true
}
}
override fun canRemoveAfterTransformation(): Boolean {
return true
}
}
class AnonymousObjectRegenerationInfo internal constructor(
override val oldClassName: String,
private val needReification: Boolean,
val lambdasToInline: Map<Int, LambdaInfo>,
private val capturedOuterRegenerated: Boolean,
private val alreadyRegenerated: Boolean,
val constructorDesc: String?,
private val isStaticOrigin: Boolean,
private val nameGenerator: NameGenerator) : RegenerationInfo() {
override val newClassName: String by lazy {
nameGenerator.genLambdaClassName()
}
var newConstructorDescriptor: String? = null
var allRecapturedParameters: List<CapturedParamDesc>? = null
var capturedLambdasToInline: Map<String, LambdaInfo>? = null
constructor(
ownerInternalName: String,
needReification: Boolean,
alreadyRegenerated: Boolean,
isStaticOrigin: Boolean,
nameGenerator: NameGenerator
) : this(
ownerInternalName, needReification,
HashMap<Int, LambdaInfo>(), false, alreadyRegenerated, null, isStaticOrigin, nameGenerator) {
}
override fun shouldRegenerate(sameModule: Boolean): Boolean {
return !alreadyRegenerated && (!lambdasToInline.isEmpty() || !sameModule || capturedOuterRegenerated || needReification)
}
override fun canRemoveAfterTransformation(): Boolean {
// Note: It is unsafe to remove anonymous class that is referenced by GETSTATIC within lambda
// because it can be local function from outer scope
return !isStaticOrigin
}
}