Resolve Android widget class fq names properly (KT-8790)
This commit is contained in:
+3
-2
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.android.synthetic.idea
|
||||
import com.intellij.openapi.module.ModuleServiceManager
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.android.synthetic.idea.res.IDESyntheticFileGenerator
|
||||
import org.jetbrains.kotlin.android.synthetic.res.SyntheticFileGenerator
|
||||
import org.jetbrains.kotlin.extensions.ExternalDeclarationsProvider
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.ModuleSourceInfo
|
||||
@@ -30,8 +31,8 @@ public class IDEAndroidExternalDeclarationsProvider(private val project: Project
|
||||
if (moduleInfo !is ModuleSourceInfo) return listOf()
|
||||
|
||||
val module = moduleInfo.module
|
||||
val parser = ModuleServiceManager.getService(module, javaClass<SyntheticFileGenerator>())!!
|
||||
val syntheticFiles = parser.getSyntheticFiles()
|
||||
val parser = ModuleServiceManager.getService(module, javaClass<SyntheticFileGenerator>()) as? IDESyntheticFileGenerator
|
||||
val syntheticFiles = parser?.getSyntheticFiles()
|
||||
syntheticFiles?.forEach { it.moduleInfo = moduleInfo }
|
||||
|
||||
return syntheticFiles ?: listOf()
|
||||
|
||||
+4
-4
@@ -21,11 +21,11 @@ import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.android.facet.AndroidFacet
|
||||
import org.jetbrains.kotlin.android.synthetic.AndroidConst
|
||||
import org.jetbrains.kotlin.android.synthetic.idea.AndroidXmlVisitor
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidModuleInfo
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidModuleInfo
|
||||
import org.jetbrains.kotlin.psi.JetProperty
|
||||
|
||||
public class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileManager(module.getProject()) {
|
||||
public class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileManager(module.project) {
|
||||
|
||||
override val androidModuleInfo: AndroidModuleInfo? by lazy { module.androidFacet?.toAndroidModuleInfo() }
|
||||
|
||||
@@ -37,7 +37,7 @@ public class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutX
|
||||
val layoutFiles = getLayoutXmlFiles()[layoutPackageName]
|
||||
if (layoutFiles == null || layoutFiles.isEmpty()) return listOf()
|
||||
|
||||
val propertyName = property.getName()
|
||||
val propertyName = property.name
|
||||
|
||||
val attributes = arrayListOf<PsiElement>()
|
||||
val visitor = AndroidXmlVisitor { retId, wClass, valueElement ->
|
||||
@@ -53,7 +53,7 @@ public class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutX
|
||||
|
||||
private fun AndroidFacet.toAndroidModuleInfo(): AndroidModuleInfo? {
|
||||
val applicationPackage = manifest?.getPackage()?.toString()
|
||||
val mainResDirectories = getAllResourceDirectories().map { it.getPath() }
|
||||
val mainResDirectories = allResourceDirectories.map { it.path }
|
||||
|
||||
return if (applicationPackage != null) {
|
||||
AndroidModuleInfo(applicationPackage, mainResDirectories)
|
||||
|
||||
+17
-11
@@ -20,6 +20,7 @@ import com.intellij.openapi.module.Module
|
||||
import com.intellij.psi.JavaPsiFacade
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.impl.PsiTreeChangePreprocessor
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import com.intellij.psi.util.CachedValue
|
||||
import com.intellij.psi.util.CachedValueProvider.Result
|
||||
import org.jetbrains.kotlin.android.synthetic.AndroidConst
|
||||
@@ -27,17 +28,24 @@ import org.jetbrains.kotlin.android.synthetic.idea.AndroidPsiTreeChangePreproces
|
||||
import org.jetbrains.kotlin.android.synthetic.idea.AndroidXmlVisitor
|
||||
import org.jetbrains.kotlin.android.synthetic.parseAndroidResource
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidResource
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidSyntheticFile
|
||||
import org.jetbrains.kotlin.android.synthetic.res.SyntheticFileGenerator
|
||||
import org.jetbrains.kotlin.psi.JetFile
|
||||
|
||||
class IDESyntheticFileGenerator(val module: Module) : SyntheticFileGenerator(module.project) {
|
||||
|
||||
private val supportV4: Boolean
|
||||
|
||||
private val javaPsiFacade: JavaPsiFacade by lazy { JavaPsiFacade.getInstance(module.project) }
|
||||
private val moduleScope: GlobalSearchScope by lazy { module.getModuleWithDependenciesAndLibrariesScope(false) }
|
||||
|
||||
private val cachedJetFiles: CachedValue<List<JetFile>> by lazy {
|
||||
cachedValue {
|
||||
Result.create(generateSyntheticJetFiles(generateSyntheticFiles(true, moduleScope)), psiTreeChangePreprocessor)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
val scope = module.getModuleWithDependenciesAndLibrariesScope(false)
|
||||
supportV4 = JavaPsiFacade.getInstance(module.getProject())
|
||||
.findClasses(AndroidConst.SUPPORT_FRAGMENT_FQNAME, scope).isNotEmpty()
|
||||
supportV4 = javaPsiFacade.findClasses(AndroidConst.SUPPORT_FRAGMENT_FQNAME, moduleScope).isNotEmpty()
|
||||
}
|
||||
|
||||
override fun supportV4() = supportV4
|
||||
@@ -48,16 +56,14 @@ class IDESyntheticFileGenerator(val module: Module) : SyntheticFileGenerator(mod
|
||||
module.project.getExtensions(PsiTreeChangePreprocessor.EP_NAME).first { it is AndroidPsiTreeChangePreprocessor }
|
||||
}
|
||||
|
||||
override val cachedSources: CachedValue<List<AndroidSyntheticFile>> by lazy {
|
||||
cachedValue {
|
||||
Result.create(generateSyntheticFiles(), psiTreeChangePreprocessor)
|
||||
}
|
||||
}
|
||||
public override fun getSyntheticFiles(): List<JetFile> = cachedJetFiles.value
|
||||
|
||||
override fun extractLayoutResources(files: List<PsiFile>): List<AndroidResource> {
|
||||
override fun extractLayoutResources(files: List<PsiFile>, scope: GlobalSearchScope): List<AndroidResource> {
|
||||
val widgets = arrayListOf<AndroidResource>()
|
||||
val visitor = AndroidXmlVisitor { id, widgetType, attribute ->
|
||||
widgets.add(parseAndroidResource(id, widgetType))
|
||||
widgets += parseAndroidResource(id, widgetType) {
|
||||
resolveFqClassNameForView(javaPsiFacade, scope, it)
|
||||
}
|
||||
}
|
||||
|
||||
files.forEach { it.accept(visitor) }
|
||||
|
||||
Reference in New Issue
Block a user