diff --git a/.idea/libraries/android_tests.xml b/.idea/libraries/android_tests.xml new file mode 100644 index 00000000000..df8f15241aa --- /dev/null +++ b/.idea/libraries/android_tests.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Kotlin.iml b/Kotlin.iml index 1f79322d25e..4278f5e1940 100644 --- a/Kotlin.iml +++ b/Kotlin.iml @@ -8,6 +8,7 @@ + @@ -45,4 +46,4 @@ - \ No newline at end of file + diff --git a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUtil.kt b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUtil.kt index 95b5e4f1648..61c304a9311 100644 --- a/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUtil.kt +++ b/compiler/frontend.android/src/org/jetbrains/jet/lang/resolve/android/AndroidUtil.kt @@ -18,6 +18,10 @@ package org.jetbrains.jet.lang.resolve.android import com.intellij.psi.PsiFile import com.intellij.psi.PsiElement +import com.intellij.openapi.project.Project +import org.jetbrains.jet.lang.psi.JetFile +import com.intellij.openapi.components.ServiceManager +import java.util.ArrayList trait AndroidResource @@ -44,4 +48,11 @@ fun isAndroidSyntheticFile(f: PsiFile?): Boolean { public fun isAndroidSyntheticElement(element: PsiElement?): Boolean { return isAndroidSyntheticFile(element?.getContainingFile()) -} \ No newline at end of file +} +public fun searchAndAddAndroidDeclarations(project: Project, originalFiles: Collection): Collection { + val parser = ServiceManager.getService(project, javaClass()) + val file = parser?.parseToPsi(project) + val files = ArrayList(originalFiles) + if (file != null) files.add(file) + return files +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt index d0f956ddbfb..0424ea48842 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt @@ -34,6 +34,11 @@ import org.jetbrains.kotlin.analyzer.ModuleContent import org.jetbrains.kotlin.di.InjectorForLazyResolveWithJava import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.jet.lang.psi.JetFile +import com.intellij.openapi.components.ServiceManager +import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor +import java.util.ArrayList +import org.jetbrains.jet.lang.resolve.android.searchAndAddAndroidDeclarations public class JvmResolverForModule( override val lazyResolveSession: ResolveSession, @@ -56,8 +61,10 @@ public object JvmAnalyzerFacade : AnalyzerFacade ): JvmResolverForModule { val (syntheticFiles, moduleContentScope) = moduleContent + val filesToAnalyze = searchAndAddAndroidDeclarations(project, syntheticFiles) val declarationProviderFactory = DeclarationProviderFactoryService.createDeclarationProviderFactory( - project, globalContext.storageManager, syntheticFiles, if (moduleInfo.isLibrary) GlobalSearchScope.EMPTY_SCOPE else moduleContentScope + project, globalContext.storageManager, filesToAnalyze, + if (moduleInfo.isLibrary) GlobalSearchScope.EMPTY_SCOPE else moduleContentScope ) val moduleClassResolver = ModuleClassResolverImpl { javaClass -> diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index d8156aa0f3e..cbb36cab018 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -17,13 +17,11 @@ package org.jetbrains.kotlin.resolve.jvm; import com.google.common.base.Predicate; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor; import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.context.GlobalContext; @@ -174,11 +172,4 @@ public enum TopDownAnalyzerFacadeForJVM { module.seal(); return module; } - - private static Collection searchAndAddAndroidDeclarations(Project project, Collection files) { - AndroidUIXmlProcessor parser = ServiceManager.getService(project, AndroidUIXmlProcessor.class); - JetFile file = parser.parseToPsi(project); - if (file != null) files.add(file); - return files; - } } diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index e603c8739df..20e01bc7672 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -145,6 +145,7 @@ import org.jetbrains.kotlin.idea.highlighter.* import org.jetbrains.jet.lang.resolve.android.AbstractAndroidXml2KConversionTest import org.jetbrains.jet.android.AbstractCrossParserTest import org.jetbrains.jet.lang.resolve.android.AbstractAndroidBoxTest +import org.jetbrains.jet.android.AbstractAndroidCompletionTest fun main(args: Array) { System.setProperty("java.awt.headless", "true") @@ -710,6 +711,10 @@ fun main(args: Array) { testClass("org.jetbrains.kotlin.idea.kdoc.KDocCompletionTestGenerated") { model("kdoc/completion") } + + testClass(javaClass()) { + model("android/completion", recursive = false, extension = null) + } } testGroup("idea/tests", "compiler/testData") { diff --git a/idea/idea.iml b/idea/idea.iml index 750a0614971..4b1492d2429 100644 --- a/idea/idea.iml +++ b/idea/idea.iml @@ -39,11 +39,12 @@ - + + diff --git a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt index c5f7b973ce5..885f3b939a1 100644 --- a/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt +++ b/idea/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt @@ -27,14 +27,11 @@ 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? = if (ApplicationManager.getApplication()!!.isUnitTestMode()) project.getUserData(TestConst.TESTDATA_PATH) + "layout/" - else project.getBasePath() + "/res/layout/" + override val searchPath: String? = project.getBasePath() + "/res/layout/" override var androidAppPackage: String = "" get() = resourceManager.readManifest()._package - override val resourceManager: AndroidResourceManager = if (ApplicationManager.getApplication()!!.isUnitTestMode()) - CliAndroidResourceManager(project, searchPath, project.getUserData(TestConst.TESTDATA_PATH) + "AndroidManifest.xml") - else IDEAndroidResourceManager(project, searchPath) + override val resourceManager: AndroidResourceManager = IDEAndroidResourceManager(project, searchPath) override fun parseSingleFileImpl(file: PsiFile): String { val ids: MutableCollection = ArrayList() diff --git a/idea/testData/android/AndroidManifest.xml b/idea/testData/android/AndroidManifest.xml new file mode 100644 index 00000000000..c82007dcc87 --- /dev/null +++ b/idea/testData/android/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml b/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml deleted file mode 100644 index 580c474f5de..00000000000 --- a/idea/testData/android/completion/PropertiesSimple/res/layout/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/idea/testData/android/completion/fqNameInAttr/fqNameInAttr.kt b/idea/testData/android/completion/fqNameInAttr/fqNameInAttr.kt new file mode 100644 index 00000000000..e70f6033309 --- /dev/null +++ b/idea/testData/android/completion/fqNameInAttr/fqNameInAttr.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity + + +class MyActivity: Activity() { + val button = this.MyBu +} + +// EXIST: MyButton diff --git a/idea/testData/android/completion/fqNameInAttr/res/layout/layout.xml b/idea/testData/android/completion/fqNameInAttr/res/layout/layout.xml new file mode 100644 index 00000000000..a0ef9f3a1ed --- /dev/null +++ b/idea/testData/android/completion/fqNameInAttr/res/layout/layout.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/idea/testData/android/completion/fqNameInTag/fqNameInTag.kt b/idea/testData/android/completion/fqNameInTag/fqNameInTag.kt new file mode 100644 index 00000000000..e70f6033309 --- /dev/null +++ b/idea/testData/android/completion/fqNameInTag/fqNameInTag.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity + + +class MyActivity: Activity() { + val button = this.MyBu +} + +// EXIST: MyButton diff --git a/idea/testData/android/completion/fqNameInTag/res/layout/layout.xml b/idea/testData/android/completion/fqNameInTag/res/layout/layout.xml new file mode 100644 index 00000000000..2ec85364e74 --- /dev/null +++ b/idea/testData/android/completion/fqNameInTag/res/layout/layout.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/idea/testData/android/completion/multiFile/multiFile.kt b/idea/testData/android/completion/multiFile/multiFile.kt new file mode 100644 index 00000000000..1a81c61f283 --- /dev/null +++ b/idea/testData/android/completion/multiFile/multiFile.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity + + +class MyActivity: Activity() { + val button = this.log +} + +// EXIST: login, loginButton diff --git a/idea/testData/android/completion/multiFile/res/layout/layout.xml b/idea/testData/android/completion/multiFile/res/layout/layout.xml new file mode 100644 index 00000000000..f4736f6937b --- /dev/null +++ b/idea/testData/android/completion/multiFile/res/layout/layout.xml @@ -0,0 +1,29 @@ + + + + + + + +