Как мне упаковать функции расширения в библиотеку jar? - PullRequest
0 голосов
/ 26 августа 2018

У меня есть набор функций расширения, которые я хотел бы упаковать в jar и включить в проект, но я не могу оценить функции расширения из jar. Я могу получить доступ к функциям без расширения из того же банка.

Например, если я создаю проект в Idea, включающий следующий файл, и создаю флягу.

package mypackagename.swtbuilder

import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.*

fun myFun() {
    println("here")
}


fun Composite.tree(treeStyle: Int = SWT.NONE, init: Tree.() -> Unit): Tree {
    val treeWidget = Tree(this, treeStyle)
    treeWidget.init()
    return treeWidget
}

Затем включите jar как зависимость в другой проект, используя что-то вроде этого в файле build.gradle.

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.5.2"
    compile files('/home/john/development/swt-builder/build/libs/swt-builder-1.0-SNAPSHOT.jar')

}

Я могу использовать myFun в новом проекте, но все функции расширения не решены.

import mypackagename.swtbuilder.myFun  // this import works
import mypackagename.swtbuilder.tree  // this import is "grayed out"

fun main(args: Array<String>) {

    val display = Display()
    myFun()  // this function call works
    val myTree = tree {    // tree is un-resolved
    }
}

Что мне нужно сделать, чтобы сделать функции расширения видимыми?

1 Ответ

0 голосов
/ 26 августа 2018

Глупая ошибка, функции расширения видны, их просто нужно вызывать в контексте объекта, расширения которого они являются. В этом случае Shell, который является подклассом Composite. У меня все это работало нормально, когда расширения и основная часть были в одном проекте. Я пытался сделать расширения отдельной библиотекой и опередил себя, пытаясь убедиться, что они были импортированы правильно.

fun main(args: Array<String>) {
    val display = Display()
    val myShell = shell {
        tree { }
    }
    myShell.open()
    while (!myShell.isDisposed) {
        if (!display.readAndDispatch()) display.sleep()
    }
    display.dispose()
}
...