Using an extension property makes object “capture script class instance”. But why?

This situation looks like a bug to me, but I’m new with Kotlin and really can’t tell.

I’m getting the following error:

Object ImportantConfigClass captures the script class instance. Try to use class or anonymous object instead

object ImportantConfigClass {
    init {
        DataClass().propExtension
    }
}

data class DataClass (
    val paused: Boolean = false
)

val DataClass.propExtension: Boolean
    get() {
        return this.paused
    }

What does it mean that it captures the script class instance, and why does that happen?

0

This is because currently Kotlin scripts on the JVM works by putting everything in the script file into a single class, i.e. your code turns into something like this:

// The name of this class is automatically generated, but let's call this class 'Script' for now
class Script {
    object ImportantConfigClass {
        init {
            DataClass().propExtension
        }
    }

    data class DataClass (
        val paused: Boolean = false
    )

    val DataClass.propExtension: Boolean
        get() {
            return this.paused
        }
}

Now it should be clear as day why this doesn’t work. To call propExtension, you not only need an instance of DataClass as the extension receiver, you also need an instance of Script as the dispatch receiver. But you do not have access to an instance of Script in the object’s init.

This is what the error means by “capture script class instance”. The “script class instance” refers to the instance of Script that you need, to call propExtension.

You might think, why doesn’t the compiler just generate some extra code to work around this? Well, it actually does, but not for objects. If ImportantConfigClass is a regular class, this code works as expected. The compiler would simply change the class to an inner class, so it has access to the enclosing instance.

From KT-19423,

For objects and other singletons that capture the script instance
(e.g. by using a property from the script), the diagnostic is now
reported from the (IR) backend.

The current JVM scripting implementation compiles scripts to classes,
and therefore the limitations are similar to what you’d get by
defining a class with a nested object. For capturing nested classes,
we are performing transformation to the inner classes. Unfortunately,
there is no such straightforward transformation for singletons.

We may change something around it in the future, but for a moment this
is the scene used for scripting, so we have to live with the
limitations.

2

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật