Collect annotations lazily

This commit is contained in:
Ilya Chernikov
2016-07-28 18:47:25 +02:00
parent 80f7dda6c7
commit 5117ecb817
@@ -171,18 +171,21 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT)
override fun <TF> getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? { override fun <TF> getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? {
val classLoader = (template as Any).javaClass.classLoader
val annotationWrappers = getAnnotationEntries(file, project) val script = BasicScriptContents(file) {
.mapNotNull { psiAnn -> val classLoader = (template as Any).javaClass.classLoader
// TODO: consider advanced matching using semantic similar to actual resolving getAnnotationEntries(file, project)
definitionData.acceptedAnnotations.find { ann -> .mapNotNull { psiAnn ->
psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName } // TODO: consider advanced matching using semantic similar to actual resolving
}?.let { KtAnnotationWrapper(psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass<out Annotation>) } definitionData.acceptedAnnotations.find { ann ->
} psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName }
val fileDeps = definitionData.resolver?.resolve(BasicScriptContents(file, annotationWrappers.map { it.getProxy(classLoader) }), }?.let { KtAnnotationWrapper(psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass<out Annotation>) }
environment, }
{ reportSeverity: ScriptDependenciesResolverEx.ReportSeverity, s: String, position: ScriptContents.Position? -> }, .map { it.getProxy(classLoader) }
previousDependencies) }
val reportFn = { reportSeverity: ScriptDependenciesResolverEx.ReportSeverity, s: String, position: ScriptContents.Position? -> }
val fileDeps = definitionData.resolver?.resolve(script, environment, reportFn, previousDependencies)
return fileDeps?.get() return fileDeps?.get()
} }
@@ -207,9 +210,10 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
return getAnnotationEntriesFromPsiFile(psiFile) return getAnnotationEntriesFromPsiFile(psiFile)
} }
class BasicScriptContents<out TF>(val myFile: TF, override val annotations: Iterable<Annotation>) : ScriptContents { class BasicScriptContents<out TF>(myFile: TF, getAnnotations: () -> Iterable<Annotation>) : ScriptContents {
override val file: File? get() = getFile(myFile) override val file: File? by lazy { getFile(myFile) }
override val text: CharSequence? get() = getFileContents(myFile) override val annotations: Iterable<Annotation> by lazy { getAnnotations() }
override val text: CharSequence? by lazy { getFileContents(myFile) }
} }
} }