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 ed1b2db8bee..ea07b28420c 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 @@ -40,13 +40,14 @@ import com.intellij.psi.PsiManager import java.io.FileInputStream import org.xml.sax.helpers.DefaultHandler import org.xml.sax.Attributes -import org.jetbrains.kotlin.resolve.android.AndroidConst.* import com.intellij.psi.PsiFileFactory import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.impl.PsiModificationTrackerImpl import java.util.Queue import com.intellij.psi.PsiFile import com.intellij.openapi.diagnostic.Logger +import org.jetbrains.jet.lang.resolve.android.AndroidConst.* +import com.intellij.openapi.application.ApplicationManager abstract class AndroidUIXmlProcessor(val project: Project) { @@ -73,7 +74,6 @@ abstract class AndroidUIXmlProcessor(val project: Project) { protected val LOG: Logger = Logger.getInstance(this.javaClass) public fun parseToString(): String? { - populateQueue() val cacheState = doParse() if (cacheState == null) return null return renderString() @@ -82,7 +82,6 @@ abstract class AndroidUIXmlProcessor(val project: Project) { public abstract val resourceManager: AndroidResourceManager public fun parseToPsi(project: Project): JetFile? { - populateQueue() val cacheState = doParse() if (cacheState == null) return null return if (cacheState == CacheAction.MISS || lastCachedPsi == null) { @@ -104,6 +103,7 @@ abstract class AndroidUIXmlProcessor(val project: Project) { private fun writeImports(kw: KotlinStringWriter): KotlinWriter { kw.writePackage(androidAppPackage) + if (ApplicationManager.getApplication()?.isUnitTestMode() ?: false) return kw for (elem in androidImports) kw.writeImport(elem) kw.writeEmptyLine() @@ -130,6 +130,7 @@ abstract class AndroidUIXmlProcessor(val project: Project) { private fun doParse(): CacheAction? { if (searchPath == null || searchPath == "") return null lazySetup() + populateQueue() var overallCacheMiss = false var file = filesToProcess.poll() while (file != null) { diff --git a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt index 7a884ae27e9..86e1e61c47b 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt @@ -27,12 +27,19 @@ import org.jetbrains.jps.android.AndroidJpsUtil import org.jetbrains.android.facet.AndroidFacet import org.jetbrains.jet.lang.resolve.android.AndroidManifest import com.intellij.openapi.module.ModuleManager +import java.util.ArrayList public class IDEAndroidResourceManager(project: Project, searchPath: String?) : AndroidResourceManagerBase(project, searchPath) { + class NoAndroidFacetException: Exception("No android facet found in project") + override fun getLayoutXmlFiles(): Collection { - val facet = getAndroidFacet() - return facet.getAllResourceDirectories() flatMap { it.findChild("layout")?.getChildren()!! map {vritualFileToPsi(it)!!}} + try { + val facet = getAndroidFacet() + return facet.getAllResourceDirectories() flatMap { it.findChild("layout")?.getChildren()!! map { vritualFileToPsi(it)!! } } + } catch (e: NoAndroidFacetException) { + return ArrayList(0) + } } private fun getAndroidFacet(): AndroidFacet { @@ -40,7 +47,7 @@ public class IDEAndroidResourceManager(project: Project, searchPath: String?) : val facet = AndroidFacet.getInstance(module) if (facet != null) return facet } - throw Exception("No android facet found in project") + throw NoAndroidFacetException() } override fun readManifest(): AndroidManifest { diff --git a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt index 92a55c27bd0..86d8996888a 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt @@ -22,13 +22,20 @@ import java.util.ArrayList import com.intellij.psi.PsiFile import org.jetbrains.jet.lang.resolve.android.AndroidWidget import org.jetbrains.jet.lang.resolve.android.KotlinStringWriter +import com.intellij.openapi.application.Application +import com.intellij.openapi.application.ApplicationManager +import org.jetbrains.jet.lang.resolve.android.CliAndroidResourceManager +import org.jetbrains.jet.lang.resolve.android.AndroidResourceManager class IDEAndroidUIXmlProcessor(project: Project) : AndroidUIXmlProcessor(project) { - override val searchPath: String? = project.getBasePath() + "/res/layout/" + override val searchPath: String? = if (ApplicationManager.getApplication()!!.isUnitTestMode()) project.getUserData(TestConst.TESTDATA_PATH) + "res/layout/" + else project.getBasePath() + "/res/layout/" override var androidAppPackage: String = "" get() = resourceManager.readManifest()._package - override val resourceManager: IDEAndroidResourceManager = IDEAndroidResourceManager(project, searchPath) + override val resourceManager: AndroidResourceManager = if (ApplicationManager.getApplication()!!.isUnitTestMode()) + CliAndroidResourceManager(project, searchPath, searchPath + "AndroidManifest.xml") + else IDEAndroidResourceManager(project, searchPath) override protected fun lazySetup() { if (listenerSetUp) return @@ -39,10 +46,10 @@ class IDEAndroidUIXmlProcessor(project: Project) : AndroidUIXmlProcessor(project override fun parseSingleFileImpl(file: PsiFile): String { val ids: MutableCollection = ArrayList() - resourceManager.resetAttributeCache() + if (!ApplicationManager.getApplication()!!.isUnitTestMode()) (resourceManager as IDEAndroidResourceManager).resetAttributeCache() file.accept(AndroidXmlVisitor(resourceManager, { id, wClass, valueElement -> ids.add(AndroidWidget(id, wClass)) - resourceManager.addMapping(id, valueElement) + if (!ApplicationManager.getApplication()!!.isUnitTestMode()) (resourceManager as IDEAndroidResourceManager).addMapping(id, valueElement) })) return produceKotlinProperties(KotlinStringWriter(), ids).toString() } diff --git a/idea/src/org/jetbrains/jet/plugin/android/TestConst.java b/idea/src/org/jetbrains/jet/plugin/android/TestConst.java new file mode 100644 index 00000000000..9612fa42c13 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/android/TestConst.java @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.android; + +import com.intellij.openapi.util.Key; + +public class TestConst { + public static final Key TESTDATA_PATH = Key.create("TEPITE"); +} diff --git a/idea/testData/android/completion/PropertiesSimple/PropertiesSimple.kt b/idea/testData/android/completion/PropertiesSimple/PropertiesSimple.kt new file mode 100644 index 00000000000..c9dbc632e72 --- /dev/null +++ b/idea/testData/android/completion/PropertiesSimple/PropertiesSimple.kt @@ -0,0 +1,11 @@ +package com.myapp + +trait Activity +trait Button + + +class MyActivity: Activity { + val button = this.log +} + +// EXIST: login diff --git a/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml b/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml new file mode 100644 index 00000000000..580c474f5de --- /dev/null +++ b/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/android/completion/PropertiesSimple/res/layout/layout.xml b/idea/testData/android/completion/PropertiesSimple/res/layout/layout.xml new file mode 100644 index 00000000000..4d73173b521 --- /dev/null +++ b/idea/testData/android/completion/PropertiesSimple/res/layout/layout.xml @@ -0,0 +1,17 @@ + + + + +