Regenerate source file when XML files are created/deleted/renamed

This commit is contained in:
Akash Yadav
2022-08-11 15:45:14 +05:30
parent 8d1987cfa4
commit 38166f381f
7 changed files with 78 additions and 22 deletions
+3
View File
@@ -34,6 +34,9 @@
<module name="AndroidIDE.gradle-tooling" target="1.8" />
<module name="AndroidIDE.gradle-tooling.plugin" target="1.8" />
<module name="AndroidIDE.javac" target="1.8" />
<module name="AndroidIDE.lookup" target="11" />
<module name="AndroidIDE.lookup.main" target="11" />
<module name="AndroidIDE.lookup.test" target="11" />
<module name="AndroidIDE.treesitter.test" target="1.7" />
</bytecodeTargetLevel>
</component>
@@ -32,6 +32,7 @@ import com.itsaky.androidide.adapters.viewholders.FileTreeViewHolder
import com.itsaky.androidide.app.StudioApp
import com.itsaky.androidide.databinding.LayoutCreateFileJavaBinding
import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding
import com.itsaky.androidide.eventbus.events.Event
import com.itsaky.androidide.eventbus.events.file.FileCreationEvent
import com.itsaky.androidide.eventbus.events.file.FileDeletionEvent
import com.itsaky.androidide.eventbus.events.file.FileRenameEvent
@@ -43,6 +44,7 @@ import com.itsaky.androidide.events.ListProjectFilesRequestEvent
import com.itsaky.androidide.fragments.sheets.OptionsListFragment
import com.itsaky.androidide.models.SheetOption
import com.itsaky.androidide.projects.ProjectManager.getProjectDirPath
import com.itsaky.androidide.projects.builder.BuildService
import com.itsaky.androidide.tasks.executeAsync
import com.itsaky.androidide.utils.DialogUtils
import com.itsaky.androidide.utils.Environment
@@ -335,7 +337,7 @@ class FileTreeActionHandler : BaseEventHandler() {
app.toast(string.msg_file_exists, ERROR)
} else {
if (FileIOUtils.writeFileFromString(newFile, content)) {
notifyFileCreated(newFile)
notifyFileCreated(newFile, context)
// TODO Notify language servers about file created event
app.toast(string.msg_file_created, SUCCESS)
if (lastHeld != null) {
@@ -406,16 +408,16 @@ class FileTreeActionHandler : BaseEventHandler() {
ProgressDialog.show(context, null, context.getString(string.please_wait), true, false)
executeAsync({ FileUtils.delete(file) }) {
progressDialog.dismiss()
val deleted = it ?: false
app.toast(
if (deleted) string.deleted else string.delete_failed,
if (deleted) SUCCESS else ERROR
)
if (deleted) {
notifyFileDeleted(file)
notifyFileDeleted(file, context)
// TODO Notify language servers about file delete event
if (lastHeld != null) {
val parent = lastHeld!!.parent
@@ -466,7 +468,7 @@ class FileTreeActionHandler : BaseEventHandler() {
if (renamed) SUCCESS else ERROR
)
if (renamed) {
notifyFileRenamed(file)
notifyFileRenamed(file, context)
// TODO Notify language servers about file rename event
if (lastHeld != null) {
val parent = lastHeld!!.parent
@@ -495,15 +497,23 @@ class FileTreeActionHandler : BaseEventHandler() {
EventBus.getDefault().post(ExpandTreeNodeRequestEvent(node))
}
private fun notifyFileRenamed(file: File) {
EventBus.getDefault().post(FileRenameEvent(file))
private fun notifyFileRenamed(file: File, context: Context) {
EventBus.getDefault().post(FileRenameEvent(file).putData(context))
}
private fun notifyFileCreated(file: File) {
EventBus.getDefault().post(FileCreationEvent(file))
private fun notifyFileCreated(file: File, context: Context) {
EventBus.getDefault().post(FileCreationEvent(file).putData(context))
}
private fun notifyFileDeleted(file: File) {
EventBus.getDefault().post(FileDeletionEvent(file))
private fun notifyFileDeleted(file: File, context: Context) {
EventBus.getDefault().post(FileDeletionEvent(file).putData(context))
}
private fun Event.putData(context: Context): Event {
put(Context::class.java, context)
if (context is EditorActivity) {
put(BuildService::class.java, context.buildService)
}
return this
}
}
@@ -16,7 +16,12 @@
*/
package com.itsaky.androidide.projects
import android.content.Context
import com.itsaky.androidide.eventbus.events.EventReceiver
import com.itsaky.androidide.eventbus.events.file.FileCreationEvent
import com.itsaky.androidide.eventbus.events.file.FileDeletionEvent
import com.itsaky.androidide.eventbus.events.file.FileEvent
import com.itsaky.androidide.eventbus.events.file.FileRenameEvent
import com.itsaky.androidide.eventbus.events.project.ProjectInitializedEvent
import com.itsaky.androidide.projects.api.AndroidModule
import com.itsaky.androidide.projects.api.ModuleProject
@@ -29,7 +34,7 @@ import java.io.File
import java.nio.file.Path
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode.MAIN
import org.greenrobot.eventbus.ThreadMode.BACKGROUND
/**
* Manages projects in AndroidIDE.
@@ -173,10 +178,39 @@ object ProjectManager : EventReceiver {
return false
}
// No-op subscriber method
@Suppress("unused")
@Subscribe(threadMode = MAIN)
fun noOp(obj: Throwable) {
throw UnsupportedOperationException("No-op")
@Subscribe(threadMode = BACKGROUND)
fun onFileCreated(event: FileCreationEvent) {
generateSourcesIfNecessary(event)
}
@Suppress("unused")
@Subscribe(threadMode = BACKGROUND)
fun onFileDeleted(event: FileDeletionEvent) {
generateSourcesIfNecessary(event)
}
@Suppress("unused")
@Subscribe(threadMode = BACKGROUND)
fun onFileRenamed(event: FileRenameEvent) {
generateSourcesIfNecessary(event)
}
private fun generateSourcesIfNecessary(event: FileEvent) {
val builder = event[BuildService::class.java] ?: return
val file = event.file
if (!isResource(file)) {
return
}
generateSources(builder)
}
private fun isResource(file: File): Boolean {
val module = findModuleForFile(file) ?: return false
if (module is AndroidModule) {
return module.getResourceDirectories().find { file.path.startsWith(it.path) } != null
}
return true
}
}
@@ -216,7 +216,11 @@ abstract class ModuleProject(
.findInPackage(packageName)
.filterIsInstance(SourceNode::class.java)
}
open fun isFromThisModule(file: File) : Boolean {
return isFromThisModule(file.toPath())
}
open fun isFromThisModule(file: Path): Boolean {
// TODO This can be probably improved
return file.startsWith(this.projectDir.toPath())
@@ -20,23 +20,28 @@ package com.itsaky.androidide.eventbus.events.file
import com.itsaky.androidide.eventbus.events.Event
import java.io.File
/** Base class for file events. */
abstract class FileEvent : Event() {
abstract val file: File
}
/**
* Event dispatched when a new file is created in the file tree.
*
* @author Akash Yadav
*/
data class FileCreationEvent(val file: File) : Event()
data class FileCreationEvent(override val file: File) : FileEvent()
/**
* Event dispatched when a file is deleted in the file tree.
*
* @author Akash Yadav
*/
data class FileDeletionEvent(val file: File) : Event()
data class FileDeletionEvent(override val file: File) : FileEvent()
/**
* Event dispatched when a file is renamed in the file tree.
*
* @author Akash Yadav
*/
class FileRenameEvent(val file: File) : Event()
class FileRenameEvent(override val file: File) : FileEvent()
+1 -1
View File
@@ -24,6 +24,7 @@ include ':lsp:testing'
include ':build-tools:framework-stubs'
include ':build-tools:google-java-format'
include ':build-tools:javac'
include ':build-tools:javac-services'
include ':build-tools:tooling-api'
include ':build-tools:tooling-api-events'
include ':build-tools:tooling-api-impl'
@@ -35,4 +36,3 @@ include ':build-tools:builder-model-impl'
include ':build-tools:jsonrpc'
include ':build-tools:projects'
include ':build-tools:tooling-api-testing'
include ':build-tools:javac-services'
Binary file not shown.