diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManager.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManager.kt index 5a512c5656f..17f797df008 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManager.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManager.kt @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project abstract class AndroidResourceManager(val project: Project, val searchPath: String?) { private val idPrefix = "@+id/" + abstract fun getLayoutXmlFiles(): Collection abstract fun idToXmlAttribute(id: String): PsiElement? abstract fun renameXmlAttr(elem: PsiElement, newName: String) @@ -29,4 +30,8 @@ abstract class AndroidResourceManager(val project: Project, val searchPath: Stri public fun nameToId(name: String): String = idPrefix + name public fun idToName(id: String): String = id.replace(idPrefix, "") public fun isResourceId(str: String?): Boolean = str?.startsWith(idPrefix) ?: false + + abstract fun readManifest(): AndroidManifest + + inner class NoUIXMLsFound : Exception("No android UI xmls found in $searchPath") } diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManagerBase.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManagerBase.kt index f8f8a96d303..21ead1cc1fb 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManagerBase.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidResourceManagerBase.kt @@ -19,9 +19,16 @@ package org.jetbrains.jet.lang.resolve.android import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.openapi.project.Project -import com.intellij.psi.PsiManager -import java.util.ArrayList import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.psi.PsiManager +import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor.NoAndroidManifestFound +import java.util.ArrayList +import java.io.File +import java.io.FileInputStream +import javax.xml.parsers.SAXParser +import javax.xml.parsers.SAXParserFactory +import org.xml.sax.helpers.DefaultHandler +import org.xml.sax.Attributes open class AndroidResourceManagerBase(project: Project, searchPath: String?) : AndroidResourceManager(project, searchPath) { override fun getLayoutXmlFiles(): Collection { @@ -40,4 +47,34 @@ open class AndroidResourceManagerBase(project: Project, searchPath: String?) : A override fun renameProperty(oldName: String, newName: String) { } + + val saxParser: SAXParser = initSAX() + + protected fun initSAX(): SAXParser { + val saxFactory = SAXParserFactory.newInstance() + saxFactory?.setNamespaceAware(true) + return saxFactory!!.newSAXParser() + } + + override fun readManifest(): AndroidManifest { + try { + val manifestXml = File(searchPath!!).getParentFile()!!.getParentFile()!!.listFiles { it.name == "AndroidManifest.xml" }!!.first() + var _package: String = "" + try { + saxParser.parse(FileInputStream(manifestXml), object : DefaultHandler() { + override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) { + if (localName == "manifest") + _package = attributes.toMap()["package"] ?: "" + } + }) + } + catch (e: Exception) { + throw e + } + return AndroidManifest(_package) + } + catch (e: Exception) { + throw NoAndroidManifestFound() + } + } } diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt index ced957ed339..c073ef5beff 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt @@ -50,7 +50,6 @@ import com.intellij.openapi.diagnostic.Logger abstract class AndroidUIXmlProcessor(val project: Project) { - inner class NoUIXMLsFound : Exception("No android UI xmls found in $searchPath") class NoAndroidManifestFound : Exception("No android manifest file found in project root") class ManifestParsingFailed @@ -64,14 +63,6 @@ abstract class AndroidUIXmlProcessor(val project: Project) { protected abstract val searchPath: String? protected abstract val androidAppPackage: String - protected val saxParser: SAXParser = initSAX() - - protected fun initSAX(): SAXParser { - val saxFactory = SAXParserFactory.newInstance() - saxFactory?.setNamespaceAware(true) - return saxFactory!!.newSAXParser() - } - private val fileCache = HashMap() private var lastCachedPsi: JetFile? = null protected val fileModificationTime: HashMap = HashMap() @@ -167,28 +158,6 @@ abstract class AndroidUIXmlProcessor(val project: Project) { protected abstract fun lazySetup() - protected fun readManifest(): AndroidManifest { - try { - val manifestXml = File(searchPath!!).getParentFile()!!.getParentFile()!!.listFiles { it.name == "AndroidManifest.xml" }!!.first() - var _package: String = "" - try { - saxParser.parse(FileInputStream(manifestXml), object : DefaultHandler() { - override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) { - if (localName == "manifest") - _package = attributes.toMap()["package"] ?: "" - } - }) - } - catch (e: Exception) { - throw e - } - return AndroidManifest(_package) - } - catch (e: Exception) { - throw NoAndroidManifestFound() - } - } - protected fun produceKotlinProperties(kw: KotlinStringWriter, ids: Collection): StringBuffer { for (id in ids) { val body = arrayListOf("return findViewById(0) as ${id.className}") diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlProcessor.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlProcessor.kt index 7e56ad80aea..af1c3ad024a 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlProcessor.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/CliAndroidUIXmlProcessor.kt @@ -24,17 +24,18 @@ class CliAndroidUIXmlProcessor(project: Project, override val searchPath: String override var androidAppPackage: String = "" + override val resourceManager: AndroidResourceManagerBase = AndroidResourceManagerBase(project, searchPath) override fun lazySetup() { populateQueue() - androidAppPackage = readManifest()._package + androidAppPackage = resourceManager.readManifest()._package } override fun parseSingleFileImpl(file: PsiFile): String { val ids: MutableCollection = ArrayList() val handler = AndroidXmlHandler({ id, wClass -> ids.add(AndroidWidget(id, wClass)) }) try { - saxParser.parse(file.getVirtualFile()?.getInputStream()!!, handler) + resourceManager.saxParser.parse(file.getVirtualFile()?.getInputStream()!!, handler) return produceKotlinProperties(KotlinStringWriter(), ids).toString() } catch (e: Throwable) { diff --git a/idea/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt b/idea/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt index 04e264749c3..e30e01cd88a 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt @@ -27,9 +27,6 @@ import com.intellij.psi.search.SearchScope import com.intellij.psi.xml.XmlAttributeValue import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper import org.jetbrains.android.util.AndroidResourceUtil -import com.intellij.psi.xml.XmlFile -import com.intellij.psi.XmlElementVisitor -import com.intellij.psi.xml.XmlTag import com.intellij.psi.xml.XmlAttribute public class AndroidRenameProcessor : RenamePsiElementProcessor() { diff --git a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt index 1d52096df7b..ef55d6130e3 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt @@ -32,7 +32,7 @@ class IDEAndroidUIXmlProcessor(project: Project) : AndroidUIXmlProcessor(project override protected fun lazySetup() { if (listenerSetUp) return - androidAppPackage = readManifest()._package + androidAppPackage = resourceManager.readManifest()._package populateQueue() listenerSetUp = true }