diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JetCoreEnvironment.java index 660e2af16ef..7ef5dcfce92 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JetCoreEnvironment.java @@ -296,7 +296,7 @@ public class JetCoreEnvironment { ); String s = configuration.get(JVMConfigurationKeys.ANDROID_RES_PATH); - project.registerService(AndroidUIXmlParser.class, new CliAndroidUIXmlParser(s)); + project.registerService(AndroidUIXmlParser.class, new CliAndroidUIXmlParser(project, s)); project.registerService(VirtualFileFinderFactory.class, new CliVirtualFileFinderFactory(classPath)); } diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlParser.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlParser.kt index 946a12b37bc..f65a692a319 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlParser.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlParser.kt @@ -118,7 +118,7 @@ abstract class AndroidUIXmlParser { private fun doParse(): CacheAction? { if (searchPath == null || searchPath == "") return null - lazySetupFileListener() + lazySetup() if (invalidateCaches) invalidateCaches() var overallCacheMiss = false var file = filesToProcess.poll() @@ -144,31 +144,7 @@ abstract class AndroidUIXmlParser { invalidateCaches = false } - private fun lazySetupFileListener() { - if (listenerSetUp) return - val fileManager = VirtualFileManager.getInstance() - val watchDir = fileManager.findFileByUrl("file://" + searchPath) - filesToProcess.addAll(watchDir?.getChildren()?.toArrayList() ?: ArrayList(0)) - fileManager.addVirtualFileListener(object : VirtualFileAdapter() { - override fun contentsChanged(event: VirtualFileEvent) { - if (event.getParent() == watchDir) - filesToProcess.add(event.getFile()) - } - override fun fileCreated(event: VirtualFileEvent) { - if (event.getParent() == watchDir) - super.fileCreated(event) - } - override fun fileDeleted(event: VirtualFileEvent) { - if (event.getParent() == watchDir) { - // ignore potential synchronisation issues - it doesn't really matter if invalidation and - // file processing will be handled in different passes - invalidateCaches = true - filesToProcess.addAll(watchDir?.getChildren()?.toArrayList() ?: ArrayList(0)) - } - } - }) - listenerSetUp = true - } + protected abstract fun lazySetup() private fun produceKotlinProperties(kw: KotlinStringWriter, ids: Collection): StringBuffer { for (id in ids) { diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlParser.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlParser.kt index dc5f98b1214..2ab9333a9c9 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlParser.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlParser.kt @@ -1,4 +1,15 @@ package org.jetbrains.jet.lang.resolve.android -class CliAndroidUIXmlParser(override val searchPath: String?): AndroidUIXmlParser() +import com.intellij.openapi.vfs.VirtualFileManager +import java.util.ArrayList +import com.intellij.openapi.project.Project + +class CliAndroidUIXmlParser(val project: Project, override val searchPath: String?): AndroidUIXmlParser() { + + override fun lazySetup() { + val fileManager = VirtualFileManager.getInstance() + val watchDir = fileManager.findFileByUrl("file://" + searchPath) + filesToProcess.addAll(watchDir?.getChildren()?.toArrayList() ?: ArrayList(0)) + } +} diff --git a/compiler/testData/android/converter/singleFile/layout.xml b/compiler/testData/android/converter/singleFile/res/layout.xml similarity index 100% rename from compiler/testData/android/converter/singleFile/layout.xml rename to compiler/testData/android/converter/singleFile/res/layout.xml diff --git a/compiler/tests/org/jetbrains/jet/codegen/AndroidXmlTest.java b/compiler/tests/org/jetbrains/jet/codegen/AndroidXmlTest.java index 2bc4391cbd2..1fa42858570 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/AndroidXmlTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/AndroidXmlTest.java @@ -20,7 +20,7 @@ import java.util.Scanner; public class AndroidXmlTest extends TestCaseWithTmpdir { - private final File singleFile = new File(getTestDataPath() + "/converter/singleFile/layout.xml"); + private final File singleFileDir = new File(getTestDataPath() + "/converter/singleFile/res/"); private final File fakeActivitySrc = new File(getTestDataPath() + "/fakeHelpers/Activity.kt"); private final File fakeViewSrc = new File(getTestDataPath() + "/fakeHelpers/View.kt"); private final File fakeWidgetsSrc = new File(getTestDataPath() + "/fakeHelpers/Widgets.kt"); @@ -50,10 +50,11 @@ public class AndroidXmlTest extends TestCaseWithTmpdir { } public void testCompileResult() throws Exception { - String text = new CliAndroidUIXmlParser(singleFile.getAbsolutePath()).parseToString(); JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(getTestRootDisposable(), ConfigurationKind.ALL); - JetFile psiFile = JetTestUtils.createFile(singleFile.getName(), text, jetCoreEnvironment.getProject()); + String text = new CliAndroidUIXmlParser(jetCoreEnvironment.getProject(), singleFileDir.getAbsolutePath()).parseToString(); + + JetFile psiFile = JetTestUtils.createFile("dummy.kt", text, jetCoreEnvironment.getProject()); JetFile fakeActivity = JetTestUtils.loadJetFile(jetCoreEnvironment.getProject(), fakeActivitySrc); JetFile fakeView = JetTestUtils.loadJetFile(jetCoreEnvironment.getProject(), fakeViewSrc); JetFile fakeWidgets = JetTestUtils.loadJetFile(jetCoreEnvironment.getProject(), fakeWidgetsSrc); @@ -70,7 +71,9 @@ public class AndroidXmlTest extends TestCaseWithTmpdir { } public void testConverterOneFile() throws Exception { - AndroidUIXmlParser parser = new CliAndroidUIXmlParser(singleFile.getAbsolutePath()); + JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(getTestRootDisposable(), + ConfigurationKind.ALL); + AndroidUIXmlParser parser = new CliAndroidUIXmlParser(jetCoreEnvironment.getProject(), singleFileDir.getAbsolutePath()); String actual = parser.parseToString(); String expected = loadOrCreate(new File(getTestDataPath() + "/converter/singleFile/layout.kt"), actual); diff --git a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlParser.kt b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlParser.kt index 74643af68fd..ebd30311acc 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlParser.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlParser.kt @@ -2,8 +2,38 @@ package org.jetbrains.jet.plugin.android import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlParser import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFileManager +import java.util.ArrayList +import com.intellij.openapi.vfs.VirtualFileAdapter +import com.intellij.openapi.vfs.VirtualFileEvent class IDEAndroidUIXmlParser(project: Project): AndroidUIXmlParser() { override val searchPath: String? = project.getBasePath() + "/res/layout/" + + override protected fun lazySetup() { + if (listenerSetUp) return + val fileManager = VirtualFileManager.getInstance() + val watchDir = fileManager.findFileByUrl("file://" + searchPath) + filesToProcess.addAll(watchDir?.getChildren()?.toArrayList() ?: ArrayList(0)) + fileManager.addVirtualFileListener(object : VirtualFileAdapter() { + override fun contentsChanged(event: VirtualFileEvent) { + if (event.getParent() == watchDir) + filesToProcess.add(event.getFile()) + } + override fun fileCreated(event: VirtualFileEvent) { + if (event.getParent() == watchDir) + super.fileCreated(event) + } + override fun fileDeleted(event: VirtualFileEvent) { + if (event.getParent() == watchDir) { + // ignore potential synchronisation issues - it doesn't really matter if invalidation and + // file processing will be handled in different passes + invalidateCaches = true + filesToProcess.addAll(watchDir?.getChildren()?.toArrayList() ?: ArrayList(0)) + } + } + }) + listenerSetUp = true + } }