ide analyzer integration stub

- add android ui xml path providers/stubs
- add generated file injection during analysis
This commit is contained in:
Mikhail Mutcianko
2014-07-16 16:22:14 +04:00
committed by Yan Zhulanow
parent aa01d6d7cf
commit 155d2fa979
9 changed files with 61 additions and 8 deletions
+1
View File
@@ -38,6 +38,7 @@
<element id="module-output" name="idea-analysis" /> <element id="module-output" name="idea-analysis" />
<element id="module-output" name="ide-common" /> <element id="module-output" name="ide-common" />
<element id="file-copy" path="$PROJECT_DIR$/resources/kotlinManifest.properties" /> <element id="file-copy" path="$PROJECT_DIR$/resources/kotlinManifest.properties" />
<element id="module-output" name="frontend.android" />
<element id="module-output" name="kotlin-android-plugin" /> <element id="module-output" name="kotlin-android-plugin" />
</element> </element>
<element id="library" level="project" name="javax.inject" /> <element id="library" level="project" name="javax.inject" />
@@ -1,13 +1,12 @@
package org.jetbrains.jet.lang.resolve.android package org.jetbrains.jet.lang.resolve.android
import java.nio.file.Path
import org.jetbrains.jet.lang.psi.JetFile
import java.util.ArrayList import java.util.ArrayList
import javax.xml.parsers.SAXParserFactory import javax.xml.parsers.SAXParserFactory
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetFile
class AndroidUIXmlParser(val project: Project?, val searchPaths: Collection<File>) { class AndroidUIXmlParser(val project: Project?, val searchPaths: Collection<File>) {
@@ -23,7 +22,7 @@ class AndroidUIXmlParser(val project: Project?, val searchPaths: Collection<File
} }
public fun parseToPsi(): JetFile { public fun parseToPsi(): JetFile {
return JetPsiFactory.createFile(project, parse()) return JetPsiFactory(project).createFile(parse())
} }
private fun isAndroidUIXml(file: File): Boolean { private fun isAndroidUIXml(file: File): Boolean {
@@ -0,0 +1,12 @@
package org.jetbrains.jet.lang.resolve.android
import java.io.File
import com.intellij.openapi.project.Project
import com.intellij.openapi.components.ServiceManager
trait AndroidUIXmlPathProvider {
class object {
fun getInstance(project: Project) = ServiceManager.getService(project, javaClass<AndroidUIXmlPathProvider>())!!
}
public fun getPaths(): Collection<File>
}
@@ -0,0 +1,11 @@
package org.jetbrains.jet.lang.resolve.android
import java.io.File
class CliAndroidUIXmlPathProvider: AndroidUIXmlPathProvider {
override fun getPaths(): MutableCollection<File> {
throw UnsupportedOperationException()
}
}
+2 -1
View File
@@ -14,5 +14,6 @@
<orderEntry type="module" module-name="serialization.jvm" /> <orderEntry type="module" module-name="serialization.jvm" />
<orderEntry type="module" module-name="descriptor.loader.java" exported="" /> <orderEntry type="module" module-name="descriptor.loader.java" exported="" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="frontend.android" />
</component> </component>
</module> </module>
@@ -17,11 +17,14 @@
package org.jetbrains.kotlin.resolve.jvm; package org.jetbrains.kotlin.resolve.jvm;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlParser;
import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlPathProvider;
import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.context.GlobalContext; import org.jetbrains.kotlin.context.GlobalContext;
@@ -42,6 +45,7 @@ import org.jetbrains.kotlin.resolve.ImportPath;
import org.jetbrains.kotlin.resolve.TopDownAnalysisParameters; import org.jetbrains.kotlin.resolve.TopDownAnalysisParameters;
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -116,8 +120,11 @@ public enum TopDownAnalyzerFacadeForJVM {
@Nullable List<String> moduleIds, @Nullable List<String> moduleIds,
@Nullable IncrementalCacheProvider incrementalCacheProvider @Nullable IncrementalCacheProvider incrementalCacheProvider
) { ) {
List<JetFile> filesToAnalyze = new ArrayList<JetFile>(files);
filesToAnalyze.add(searchForAndroidDeclarations(project));
FileBasedDeclarationProviderFactory providerFactory = FileBasedDeclarationProviderFactory providerFactory =
new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), files); new FileBasedDeclarationProviderFactory(topDownAnalysisParameters.getStorageManager(), filesToAnalyze);
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm( InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
project, project,
@@ -146,7 +153,7 @@ public enum TopDownAnalyzerFacadeForJVM {
} }
additionalProviders.add(injector.getJavaDescriptorResolver().getPackageFragmentProvider()); additionalProviders.add(injector.getJavaDescriptorResolver().getPackageFragmentProvider());
injector.getLazyTopDownAnalyzerForTopLevel().analyzeFiles(topDownAnalysisParameters, files, additionalProviders); injector.getLazyTopDownAnalyzerForTopLevel().analyzeFiles(topDownAnalysisParameters, filesToAnalyze, additionalProviders);
return AnalysisResult.success(trace.getBindingContext(), module); return AnalysisResult.success(trace.getBindingContext(), module);
} }
finally { finally {
@@ -169,4 +176,10 @@ public enum TopDownAnalyzerFacadeForJVM {
module.seal(); module.seal();
return module; return module;
} }
private static JetFile searchForAndroidDeclarations(Project project) {
AndroidUIXmlPathProvider provider = ServiceManager.getService(project, AndroidUIXmlPathProvider.class);
Collection<File> paths = provider.getPaths();
return new AndroidUIXmlParser(project, paths).parseToPsi();
}
} }
+2 -1
View File
@@ -39,10 +39,11 @@
<orderEntry type="module" module-name="serialization.jvm" /> <orderEntry type="module" module-name="serialization.jvm" />
<orderEntry type="library" scope="PROVIDED" name="maven" level="project" /> <orderEntry type="library" scope="PROVIDED" name="maven" level="project" />
<orderEntry type="module" module-name="eval4j" /> <orderEntry type="module" module-name="eval4j" />
<orderEntry type="module" module-name="frontend.android" />
<orderEntry type="module" module-name="idea-analysis" exported="" /> <orderEntry type="module" module-name="idea-analysis" exported="" />
<orderEntry type="module" module-name="kotlin-android-plugin" /> <orderEntry type="module" module-name="kotlin-android-plugin" />
<orderEntry type="module" module-name="js.frontend" /> <orderEntry type="module" module-name="js.frontend" />
<orderEntry type="library" scope="PROVIDED" name="coverage-plugin" level="project" /> <orderEntry type="library" scope="PROVIDED" name="coverage-plugin" level="project" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
</component> </component>
</module> </module>
+3
View File
@@ -192,6 +192,9 @@
<projectService serviceInterface="org.jetbrains.kotlin.idea.stubindex.SubpackagesIndexService" <projectService serviceInterface="org.jetbrains.kotlin.idea.stubindex.SubpackagesIndexService"
serviceImplementation="org.jetbrains.kotlin.idea.stubindex.SubpackagesIndexService"/> serviceImplementation="org.jetbrains.kotlin.idea.stubindex.SubpackagesIndexService"/>
<projectService serviceInterface="org.jetbrains.jet.lang.resolve.android.AndroidUIXmlPathProvider"
serviceImplementation="org.jetbrains.jet.plugin.android.IDEAndroidUIXmlPathProvider"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker" <projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker"/> serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.LibraryModificationTracker"/>
@@ -0,0 +1,12 @@
package org.jetbrains.jet.plugin.android
import com.intellij.openapi.project.Project
import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlPathProvider
import java.io.File
class IDEAndroidUIXmlPathProvider(val project: Project): AndroidUIXmlPathProvider {
override fun getPaths(): MutableCollection<File> {
return arrayListOf(File("/tmp/android/"))
}
}