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 033665a8f67..b5d844afa20 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 @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.psi.JetFile import java.util.ArrayList import org.jetbrains.jet.extensions.ExternalDeclarationsProvider import kotlin.platform.platformStatic +import com.intellij.openapi.module.Module public class JvmResolverForModule( override val lazyResolveSession: ResolveSession, @@ -60,7 +61,7 @@ public object JvmAnalyzerFacade : AnalyzerFacade ): JvmResolverForModule { val (syntheticFiles, moduleContentScope) = moduleContent - val filesToAnalyze = getAllFilesToAnalyze(project, syntheticFiles) + val filesToAnalyze = getAllFilesToAnalyze(project, moduleInfo, syntheticFiles) val declarationProviderFactory = DeclarationProviderFactoryService.createDeclarationProviderFactory( project, globalContext.storageManager, filesToAnalyze, if (moduleInfo.isLibrary) GlobalSearchScope.EMPTY_SCOPE else moduleContentScope @@ -87,10 +88,10 @@ public object JvmAnalyzerFacade : AnalyzerFacade): List { + public platformStatic fun getAllFilesToAnalyze(project: Project, moduleInfo: ModuleInfo?, baseFiles: Collection): List { val allFiles = ArrayList(baseFiles) for (externalDeclarationsProvider in ExternalDeclarationsProvider.getInstances(project)) { - allFiles.addAll(externalDeclarationsProvider.getExternalDeclarations()) + allFiles.addAll(externalDeclarationsProvider.getExternalDeclarations(moduleInfo)) } return allFiles } 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 542bcc43bdd..f997b385b8a 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 @@ -116,7 +116,7 @@ public enum TopDownAnalyzerFacadeForJVM { @Nullable List moduleIds, @Nullable IncrementalCacheProvider incrementalCacheProvider ) { - List allFiles = JvmAnalyzerFacade.getAllFilesToAnalyze(project, files); + List allFiles = JvmAnalyzerFacade.getAllFilesToAnalyze(project, null, files); FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), allFiles); diff --git a/compiler/frontend/src/org/jetbrains/jet/extensions/ExternalDeclarationsProvider.kt b/compiler/frontend/src/org/jetbrains/jet/extensions/ExternalDeclarationsProvider.kt index c5f92728650..8aef4f9ff93 100644 --- a/compiler/frontend/src/org/jetbrains/jet/extensions/ExternalDeclarationsProvider.kt +++ b/compiler/frontend/src/org/jetbrains/jet/extensions/ExternalDeclarationsProvider.kt @@ -17,6 +17,7 @@ package org.jetbrains.jet.extensions import org.jetbrains.jet.lang.psi.JetFile +import org.jetbrains.jet.analyzer.ModuleInfo public trait ExternalDeclarationsProvider { class object : ProjectExtensionDescriptor( @@ -24,5 +25,5 @@ public trait ExternalDeclarationsProvider { javaClass() ) - public fun getExternalDeclarations(): Collection + public fun getExternalDeclarations(moduleInfo: ModuleInfo?): Collection } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiFactory.kt index 6a638573606..02c688ee7ce 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiFactory.kt @@ -32,12 +32,14 @@ import java.io.StringWriter import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.PsiComment import org.jetbrains.kotlin.name.FqName +import org.jetbrains.jet.analyzer.ModuleInfo public fun JetPsiFactory(project: Project?): JetPsiFactory = JetPsiFactory(project!!) public fun JetPsiFactory(contextElement: JetElement): JetPsiFactory = JetPsiFactory(contextElement.getProject()) public var JetFile.doNotAnalyze: String? by UserDataProperty(Key.create("DO_NOT_ANALYZE")) public var JetFile.analysisContext: PsiElement? by UserDataProperty(Key.create("ANALYSIS_CONTEXT")) +public var JetFile.moduleInfo: ModuleInfo? by UserDataProperty(Key.create("MODULE_INFO")) public class JetPsiFactory(private val project: Project) { diff --git a/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt index b92c71f58d9..e53ac0177d6 100644 --- a/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt +++ b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt @@ -50,6 +50,7 @@ import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaClassDescriptor import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.analyzer.ModuleInfo public object AndroidConfigurationKeys { @@ -79,8 +80,8 @@ public class AndroidCommandLineProcessor : CommandLineProcessor { } } -public class AndroidDeclarationsProvider(private val project: Project) : ExternalDeclarationsProvider { - override fun getExternalDeclarations(): Collection { +public class CliAndroidDeclarationsProvider(private val project: Project) : ExternalDeclarationsProvider { + override fun getExternalDeclarations(moduleInfo: ModuleInfo?): Collection { val parser = ServiceManager.getService(project, javaClass()) return emptyOrSingletonList(parser?.parseToPsi(project)) } @@ -219,7 +220,7 @@ public class AndroidComponentRegistrar : ComponentRegistrar { val androidManifest = configuration.get(AndroidConfigurationKeys.ANDROID_MANIFEST) project.registerService(javaClass(), CliAndroidUIXmlProcessor(project, androidResPath, androidManifest)) - ExternalDeclarationsProvider.registerExtension(project, AndroidDeclarationsProvider(project)) + ExternalDeclarationsProvider.registerExtension(project, CliAndroidDeclarationsProvider(project)) ExpressionCodegenExtension.registerExtension(project, AndroidExpressionCodegen()) } } \ No newline at end of file diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt b/plugins/android-compiler-plugin/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt index 6d55bff5edd..c3c8760d567 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/jet/lang/resolve/android/AndroidUIXmlProcessor.kt @@ -47,6 +47,8 @@ import java.util.Queue import com.intellij.psi.PsiFile import com.intellij.openapi.diagnostic.Logger import org.jetbrains.jet.lang.resolve.android.AndroidConst.* +import org.jetbrains.jet.analyzer.ModuleInfo +import com.intellij.openapi.module.Module public abstract class AndroidUIXmlProcessor(protected val project: Project) { diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt index 5ec16eef328..72e14627c9a 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt @@ -1,4 +1,4 @@ -package com.myapp +package kotlinx.android.synthetic.layout import android.app.Activity import android.view.View diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt index 5ec16eef328..72e14627c9a 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt @@ -1,4 +1,4 @@ -package com.myapp +package kotlinx.android.synthetic.layout import android.app.Activity import android.view.View diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt index 313d0b13d16..dac5cc16ca2 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt @@ -1,4 +1,4 @@ -package com.myapp +package kotlinx.android.synthetic.layout import android.app.Activity import android.view.View @@ -16,15 +16,3 @@ val Activity.password: EditText val Activity.login: Button get() = findViewById(0) as Button -val Activity.frameLayout: FrameLayout - get() = findViewById(0) as FrameLayout - -val Activity.passwordField: TextView - get() = findViewById(0) as TextView - -val Activity.passwordCaption: EditText - get() = findViewById(0) as EditText - -val Activity.loginButton: Button - get() = findViewById(0) as Button - diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/noIds/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/noIds/layout.kt index efb6ca1b54b..deb2fee9df8 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/noIds/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/noIds/layout.kt @@ -1,4 +1,4 @@ -package com.myapp +package kotlinx.android.synthetic.layout import android.app.Activity import android.view.View diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt index c8ebd646620..dac5cc16ca2 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt @@ -1,4 +1,4 @@ -package com.myapp +package kotlinx.android.synthetic.layout import android.app.Activity import android.view.View diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/0.kt index bd9ef5426c0..5dcf46252e8 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/0.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/0.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.view.View import android.widget.* import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/1.kt index d7202aa8c72..0d63e306610 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/1.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInAttr/1.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.view.View import android.widget.* import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/0.kt index bd9ef5426c0..5dcf46252e8 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/0.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/0.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.view.View import android.widget.* import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/1.kt index d7202aa8c72..0d63e306610 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/1.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/fqNameInTag/1.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.view.View import android.widget.* import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/multiFile/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/multiFile/0.kt index 05a1550c321..26e39121149 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/multiFile/0.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/multiFile/0.kt @@ -3,6 +3,8 @@ package com.myapp import android.app.Activity import android.view.View import android.widget.* +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout1.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/multiFile/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/multiFile/1.kt index 246b6dee346..9a584c51a6d 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/multiFile/1.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/multiFile/1.kt @@ -3,6 +3,8 @@ package com.myapp import android.app.Activity import android.view.View import android.widget.* +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout1.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/singleFile/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/singleFile/0.kt index d6d69263b8d..e8b8f6afdbf 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/singleFile/0.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/singleFile/0.kt @@ -3,6 +3,7 @@ package com.myapp import android.app.Activity import android.view.View import android.widget.* +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/android/singleFile/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/singleFile/1.kt index 246b6dee346..f0f5babecb5 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/singleFile/1.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/singleFile/1.kt @@ -3,6 +3,7 @@ package com.myapp import android.app.Activity import android.view.View import android.widget.* +import kotlinx.android.synthetic.layout.* class R { class id { diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttr/fqNameInAttr.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttr/fqNameInAttr.kt index aab67b137aa..380c1309ac7 100644 --- a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttr/fqNameInAttr.kt +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttr/fqNameInAttr.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTag/fqNameInTag.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTag/fqNameInTag.kt index aab67b137aa..380c1309ac7 100644 --- a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTag/fqNameInTag.kt +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTag/fqNameInTag.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFile/multiFile.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFile/multiFile.kt index f4bd65e7804..cb16371c27f 100644 --- a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFile/multiFile.kt +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFile/multiFile.kt @@ -1,6 +1,8 @@ package com.myapp import android.app.Activity +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout1.* class MyActivity: Activity() { val button = this.login diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simple/simple.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simple/simple.kt index 5715a5b5bf6..63ff50affe4 100644 --- a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simple/simple.kt +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simple/simple.kt @@ -3,7 +3,7 @@ package com.myapp import android.app.Activity import android.os.Bundle import java.io.File - +import kotlinx.android.synthetic.layout.* public class MyActivity : Activity() { {login} diff --git a/plugins/android-compiler-plugin/tests/org/jetbrains/jet/lang/resolve/android/test/CompilerTestUtils.kt b/plugins/android-compiler-plugin/tests/org/jetbrains/jet/lang/resolve/android/test/CompilerTestUtils.kt index 5a33bc50a43..d506a83ebba 100644 --- a/plugins/android-compiler-plugin/tests/org/jetbrains/jet/lang/resolve/android/test/CompilerTestUtils.kt +++ b/plugins/android-compiler-plugin/tests/org/jetbrains/jet/lang/resolve/android/test/CompilerTestUtils.kt @@ -28,13 +28,14 @@ import org.jetbrains.kotlin.android.AndroidExpressionCodegen import org.jetbrains.jet.config.CompilerConfiguration import com.intellij.testFramework.UsefulTestCase import org.jetbrains.jet.lang.resolve.android.CliAndroidUIXmlProcessor +import org.jetbrains.jet.analyzer.ModuleInfo -private class AndroidTestDeclarationsProvider( +private class AndroidTestExternalDeclarationsProvider( val project: Project, val resPath: String, val manifestPath: String ) : ExternalDeclarationsProvider { - override fun getExternalDeclarations(): Collection { + override fun getExternalDeclarations(moduleInfo: ModuleInfo?): Collection { val parser = CliAndroidUIXmlProcessor(project, resPath, manifestPath) return emptyOrSingletonList(parser.parseToPsi(project)) } @@ -49,7 +50,7 @@ fun UsefulTestCase.createAndroidTestEnvironment( configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, manifestPath) val myEnvironment = JetCoreEnvironment.createForTests(getTestRootDisposable()!!, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) val project = myEnvironment.getProject() - ExternalDeclarationsProvider.registerExtension(project, AndroidTestDeclarationsProvider(project, resPath, manifestPath)) + ExternalDeclarationsProvider.registerExtension(project, AndroidTestExternalDeclarationsProvider(project, resPath, manifestPath)) ExpressionCodegenExtension.registerExtension(project, AndroidExpressionCodegen()) return myEnvironment } diff --git a/plugins/android-idea-plugin/src/META-INF/plugin.xml b/plugins/android-idea-plugin/src/META-INF/plugin.xml index 6917f041a9f..acc5ee2e7d8 100644 --- a/plugins/android-idea-plugin/src/META-INF/plugin.xml +++ b/plugins/android-idea-plugin/src/META-INF/plugin.xml @@ -12,7 +12,7 @@ org.jetbrains.android - @@ -22,7 +22,7 @@ - + diff --git a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidGotoDeclarationHandler.kt b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidGotoDeclarationHandler.kt index 3d9a9892f8d..029c6d7fafc 100644 --- a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidGotoDeclarationHandler.kt +++ b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidGotoDeclarationHandler.kt @@ -30,6 +30,9 @@ import com.intellij.psi.impl.light.LightElement import com.intellij.psi.xml.XmlAttribute import org.jetbrains.jet.lang.resolve.android.isRClassField import com.intellij.psi.PsiField +import com.intellij.openapi.module.ModuleServiceManager +import org.jetbrains.jet.plugin.caches.resolve.getModuleInfo +import org.jetbrains.jet.plugin.caches.resolve.ModuleSourceInfo public class AndroidGotoDeclarationHandler : GotoDeclarationHandler { override fun getGotoDeclarationTargets(sourceElement: PsiElement?, offset: Int, editor: Editor?): Array? { @@ -41,10 +44,13 @@ public class AndroidGotoDeclarationHandler : GotoDeclarationHandler { } else null if (name != null) { - val parser = ServiceManager.getService(sourceElement.getProject(), javaClass()) - val psiElement = parser?.resourceManager?.idToXmlAttribute(name) as? XmlAttribute + val moduleInfo = sourceElement.getModuleInfo() + if (moduleInfo !is ModuleSourceInfo) return null + + val parser = ModuleServiceManager.getService(moduleInfo.module, javaClass()) + val psiElement = parser.resourceManager.idToXmlAttribute(name) as? XmlAttribute if (psiElement != null) { - return array(psiElement.getValueElement()!!) + return array(psiElement.getValueElement()) } } } diff --git a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt index a2c7dfbc594..c9562217940 100644 --- a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt +++ b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/AndroidRenameProcessor.kt @@ -30,6 +30,12 @@ import org.jetbrains.android.util.AndroidResourceUtil import com.intellij.psi.xml.XmlAttribute import com.intellij.psi.impl.light.LightElement import org.jetbrains.jet.lang.resolve.android.isRClassField +import com.intellij.openapi.module.ModuleServiceManager +import org.jetbrains.jet.plugin.caches.resolve.getModuleInfo +import org.jetbrains.jet.plugin.caches.resolve.ModuleSourceInfo +import com.intellij.openapi.module.Module +import org.jetbrains.jet.lang.psi.JetFile +import org.jetbrains.jet.lang.psi.moduleInfo public class AndroidRenameProcessor : RenamePsiElementProcessor() { override fun canProcessElement(element: PsiElement): Boolean { @@ -39,9 +45,22 @@ public class AndroidRenameProcessor : RenamePsiElementProcessor() { isRClassField(element) } + private fun PsiElement.getModule(): Module? { + val moduleInfo = getModuleInfo() + if (moduleInfo is ModuleSourceInfo) return moduleInfo.module + + val file = getContainingFile() as? JetFile + if (file != null) { + val moduleInfo = file.moduleInfo + if (moduleInfo is ModuleSourceInfo) return moduleInfo.module + } + + return null + } + override fun prepareRenaming(element: PsiElement?, newName: String?, allRenames: MutableMap, scope: SearchScope) { - if (element?.namedUnwrappedElement is JetProperty) { - renameSyntheticProperty(element!!.namedUnwrappedElement as JetProperty, newName, allRenames, scope) + if (element != null && element.namedUnwrappedElement is JetProperty) { + renameSyntheticProperty(element.namedUnwrappedElement as JetProperty, newName, allRenames, scope) } else if (element is XmlAttributeValue) { renameAttributeValue(element, newName, allRenames, scope) @@ -52,8 +71,11 @@ public class AndroidRenameProcessor : RenamePsiElementProcessor() { } private fun renameSyntheticProperty(jetProperty: JetProperty, newName: String?, allRenames: MutableMap, scope: SearchScope) { - val oldName = jetProperty.getName()!! - val processor = ServiceManager.getService(jetProperty.getProject(), javaClass()) + val oldName = jetProperty.getName() + val module = jetProperty.getModule() + if (module == null) return + + val processor = ModuleServiceManager.getService(module, javaClass()) val resourceManager = processor!!.resourceManager val attr = resourceManager.idToXmlAttribute(oldName) as XmlAttribute allRenames[XmlAttributeValueWrapper(attr.getValueElement()!!)] = resourceManager.nameToIdDeclaration(newName!!) @@ -64,8 +86,11 @@ public class AndroidRenameProcessor : RenamePsiElementProcessor() { } private fun renameAttributeValue(attribute: XmlAttributeValue, newName: String?, allRenames: MutableMap, scope: SearchScope) { - val element1 = LazyValueResourceElementWrapper.computeLazyElement(attribute); - val processor = ServiceManager.getService(attribute.getProject(), javaClass()) + val element1 = LazyValueResourceElementWrapper.computeLazyElement(attribute) + val module = attribute.getModule() + if (module == null) return + + val processor = ModuleServiceManager.getService(module, javaClass()) if (element1 == null) return val oldPropName = AndroidResourceUtil.getResourceNameByReferenceText(attribute.getValue()!!) val newPropName = processor!!.resourceManager.idToName(newName!!) @@ -81,7 +106,7 @@ public class AndroidRenameProcessor : RenamePsiElementProcessor() { } private fun renameLightClassField(field: LightElement, newName: String?, allRenames: MutableMap, scope: SearchScope) { - val oldName = field.getName()!! + val oldName = field.getName() val processor = ServiceManager.getService(field.getProject(), javaClass()) renameSyntheticProperties(allRenames, newName!!, oldName, processor!!) } diff --git a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidExternalDeclarationsProvider.kt b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidExternalDeclarationsProvider.kt new file mode 100644 index 00000000000..147201c8656 --- /dev/null +++ b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidExternalDeclarationsProvider.kt @@ -0,0 +1,40 @@ +/* + * 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.project.Project +import org.jetbrains.jet.extensions.ExternalDeclarationsProvider +import org.jetbrains.jet.analyzer.ModuleInfo +import org.jetbrains.jet.lang.psi.JetFile +import com.intellij.openapi.components.ServiceManager +import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor +import org.jetbrains.jet.plugin.caches.resolve.ModuleSourceInfo +import com.intellij.openapi.module.ModuleServiceManager +import org.jetbrains.jet.lang.psi.moduleInfo + +public class IDEAndroidExternalDeclarationsProvider(private val project: Project) : ExternalDeclarationsProvider { + override fun getExternalDeclarations(moduleInfo: ModuleInfo?): Collection { + if (moduleInfo !is ModuleSourceInfo) return listOf() + + val module = moduleInfo.module + val parser = ModuleServiceManager.getService(module, javaClass()) + val syntheticFile = parser.parseToPsi(project) + syntheticFile?.moduleInfo = moduleInfo + + return if (syntheticFile != null) listOf(syntheticFile) else listOf() + } +} \ No newline at end of file diff --git a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt index fd6ca7428c3..2d1b4bfea05 100644 --- a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt +++ b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidResourceManager.kt @@ -27,8 +27,9 @@ import org.jetbrains.jet.lang.resolve.android.AndroidManifest import com.intellij.openapi.module.ModuleManager import java.util.ArrayList import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.module.Module -public class IDEAndroidResourceManager(project: Project, searchPath: String?) : AndroidResourceManagerBase(project, searchPath) { +public class IDEAndroidResourceManager(val module: Module, searchPath: String?) : AndroidResourceManagerBase(module.getProject(), searchPath) { override fun getLayoutXmlFiles(): Collection { val directories = getAndroidFacet()?.getAllResourceDirectories() ?: listOf() @@ -38,17 +39,13 @@ public class IDEAndroidResourceManager(project: Project, searchPath: String?) : } private fun getAndroidFacet(): AndroidFacet? { - for (module in ModuleManager.getInstance(project).getModules()) { - val facet = AndroidFacet.getInstance(module) - if (facet != null) return facet - } - return null + return AndroidFacet.getInstance(module) } override fun readManifest(): AndroidManifest { val facet = getAndroidFacet() val attributeValue = facet?.getManifest()!!.getPackage() - return AndroidManifest(attributeValue!!.getRawText()!!) + return AndroidManifest(attributeValue.getRawText()) } override fun idToXmlAttribute(id: String): PsiElement? { diff --git a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt index a26e4e3a074..734e59eb0fd 100644 --- a/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt +++ b/plugins/android-idea-plugin/src/org/jetbrains/jet/plugin/android/IDEAndroidUIXmlProcessor.kt @@ -25,13 +25,14 @@ import org.jetbrains.jet.lang.resolve.android.KotlinStringWriter import com.intellij.openapi.application.ApplicationManager import org.jetbrains.jet.lang.resolve.android.CliAndroidResourceManager import org.jetbrains.jet.lang.resolve.android.AndroidResourceManager +import com.intellij.openapi.module.Module -class IDEAndroidUIXmlProcessor(project: Project) : AndroidUIXmlProcessor(project) { +class IDEAndroidUIXmlProcessor(val module: Module) : AndroidUIXmlProcessor(module.getProject()) { override val searchPath: String? = project.getBasePath() + "/res/layout/" override var androidAppPackage: String = "" get() = resourceManager.readManifest()._package - override val resourceManager: IDEAndroidResourceManager = IDEAndroidResourceManager(project, searchPath) + override val resourceManager: IDEAndroidResourceManager = IDEAndroidResourceManager(module, searchPath) override fun parseSingleFileImpl(file: PsiFile): String { val ids: MutableCollection = ArrayList() diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInAttr/fqNameInAttr.kt b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttr/fqNameInAttr.kt index e70f6033309..897c0aaf103 100644 --- a/plugins/android-idea-plugin/testData/android/completion/fqNameInAttr/fqNameInAttr.kt +++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttr/fqNameInAttr.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyBu diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInTag/fqNameInTag.kt b/plugins/android-idea-plugin/testData/android/completion/fqNameInTag/fqNameInTag.kt index e70f6033309..897c0aaf103 100644 --- a/plugins/android-idea-plugin/testData/android/completion/fqNameInTag/fqNameInTag.kt +++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInTag/fqNameInTag.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyBu diff --git a/plugins/android-idea-plugin/testData/android/completion/multiFile/multiFile.kt b/plugins/android-idea-plugin/testData/android/completion/multiFile/multiFile.kt index 54bbc38d123..cf66d4b9eeb 100644 --- a/plugins/android-idea-plugin/testData/android/completion/multiFile/multiFile.kt +++ b/plugins/android-idea-plugin/testData/android/completion/multiFile/multiFile.kt @@ -1,7 +1,8 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout1.* class MyActivity: Activity() { val button = log diff --git a/plugins/android-idea-plugin/testData/android/completion/propertiesSimple/propertiesSimple.kt b/plugins/android-idea-plugin/testData/android/completion/propertiesSimple/propertiesSimple.kt index 68699e7983d..5bd219fdb97 100644 --- a/plugins/android-idea-plugin/testData/android/completion/propertiesSimple/propertiesSimple.kt +++ b/plugins/android-idea-plugin/testData/android/completion/propertiesSimple/propertiesSimple.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.login diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttr/fqNameInAttr.kt b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttr/fqNameInAttr.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttr/fqNameInAttr.kt +++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttr/fqNameInAttr.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTag/fqNameInTag.kt b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTag/fqNameInTag.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTag/fqNameInTag.kt +++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTag/fqNameInTag.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/findUsages/multiFile/multiFile.kt b/plugins/android-idea-plugin/testData/android/findUsages/multiFile/multiFile.kt index fdd80a87ace..7054121e425 100644 --- a/plugins/android-idea-plugin/testData/android/findUsages/multiFile/multiFile.kt +++ b/plugins/android-idea-plugin/testData/android/findUsages/multiFile/multiFile.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.login diff --git a/plugins/android-idea-plugin/testData/android/findUsages/simple/simple.kt b/plugins/android-idea-plugin/testData/android/findUsages/simple/simple.kt index fa794510dd9..39ac825f48c 100644 --- a/plugins/android-idea-plugin/testData/android/findUsages/simple/simple.kt +++ b/plugins/android-idea-plugin/testData/android/findUsages/simple/simple.kt @@ -3,7 +3,7 @@ package com.myapp import android.app.Activity import android.os.Bundle import java.io.File - +import kotlinx.android.synthetic.layout.* public class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) {} diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInAttr/fqNameInAttr.kt b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttr/fqNameInAttr.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/goto/fqNameInAttr/fqNameInAttr.kt +++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttr/fqNameInAttr.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInTag/fqNameInTag.kt b/plugins/android-idea-plugin/testData/android/goto/fqNameInTag/fqNameInTag.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/goto/fqNameInTag/fqNameInTag.kt +++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInTag/fqNameInTag.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/goto/multiFile/multiFile.kt b/plugins/android-idea-plugin/testData/android/goto/multiFile/multiFile.kt index fdd80a87ace..7054121e425 100644 --- a/plugins/android-idea-plugin/testData/android/goto/multiFile/multiFile.kt +++ b/plugins/android-idea-plugin/testData/android/goto/multiFile/multiFile.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.login diff --git a/plugins/android-idea-plugin/testData/android/goto/simple/simple.kt b/plugins/android-idea-plugin/testData/android/goto/simple/simple.kt index 4df9999a980..9686bc943ca 100644 --- a/plugins/android-idea-plugin/testData/android/goto/simple/simple.kt +++ b/plugins/android-idea-plugin/testData/android/goto/simple/simple.kt @@ -3,7 +3,7 @@ package com.myapp import android.app.Activity import android.os.Bundle import java.io.File - +import kotlinx.android.synthetic.layout.* public class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) {} diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInAttr/fqNameInAttr.kt b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttr/fqNameInAttr.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/rename/fqNameInAttr/fqNameInAttr.kt +++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttr/fqNameInAttr.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInTag/fqNameInTag.kt b/plugins/android-idea-plugin/testData/android/rename/fqNameInTag/fqNameInTag.kt index 1c131f1da38..2ae4265ea17 100644 --- a/plugins/android-idea-plugin/testData/android/rename/fqNameInTag/fqNameInTag.kt +++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInTag/fqNameInTag.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.MyButton diff --git a/plugins/android-idea-plugin/testData/android/rename/multiFile/multiFile.kt b/plugins/android-idea-plugin/testData/android/rename/multiFile/multiFile.kt index fdd80a87ace..7054121e425 100644 --- a/plugins/android-idea-plugin/testData/android/rename/multiFile/multiFile.kt +++ b/plugins/android-idea-plugin/testData/android/rename/multiFile/multiFile.kt @@ -1,7 +1,7 @@ package com.myapp import android.app.Activity - +import kotlinx.android.synthetic.layout.* class MyActivity: Activity() { val button = this.login diff --git a/plugins/android-idea-plugin/testData/android/rename/simple/simple.kt b/plugins/android-idea-plugin/testData/android/rename/simple/simple.kt index 4df9999a980..9686bc943ca 100644 --- a/plugins/android-idea-plugin/testData/android/rename/simple/simple.kt +++ b/plugins/android-idea-plugin/testData/android/rename/simple/simple.kt @@ -3,7 +3,7 @@ package com.myapp import android.app.Activity import android.os.Bundle import java.io.File - +import kotlinx.android.synthetic.layout.* public class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) {} diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/jet/android/AbstractParserResultEqualityTest.kt b/plugins/android-idea-plugin/tests/org/jetbrains/jet/android/AbstractParserResultEqualityTest.kt index 147e8cce87c..261e46011a8 100644 --- a/plugins/android-idea-plugin/tests/org/jetbrains/jet/android/AbstractParserResultEqualityTest.kt +++ b/plugins/android-idea-plugin/tests/org/jetbrains/jet/android/AbstractParserResultEqualityTest.kt @@ -28,6 +28,7 @@ import org.jetbrains.jet.plugin.android.TestConst import org.jetbrains.jet.plugin.PluginTestCaseBase import org.jetbrains.kotlin.android.AndroidConfigurationKeys import org.jetbrains.jet.cli.jvm.compiler.EnvironmentConfigFiles +import com.intellij.openapi.module.ModuleManager public abstract class AbstractParserResultEqualityTest : KotlinAndroidTestCase() { public fun doTest(path: String) { @@ -35,7 +36,7 @@ public abstract class AbstractParserResultEqualityTest : KotlinAndroidTestCase() project.putUserData(TestConst.TESTDATA_PATH, path) myFixture!!.copyDirectoryToProject(getResDir()!!, "res") val cliParser = CliAndroidUIXmlProcessor(project, path + getResDir() + "/layout/", path + "../AndroidManifest.xml") - val ideParser = IDEAndroidUIXmlProcessor(project) + val ideParser = IDEAndroidUIXmlProcessor(ModuleManager.getInstance(project).getModules()[0]) val cliResult = cliParser.parseToPsi(project)!!.getText() val ideResult = ideParser.parseToPsi(project)!!.getText() diff --git a/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt b/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt index b57014a16bf..15812470b90 100644 --- a/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt +++ b/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt @@ -3,6 +3,8 @@ package com.example.myapp import android.app.Activity import android.os.Bundle +import kotlinx.android.synthetic.main.* + public class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)