diff --git a/.idea/compiler.xml b/.idea/compiler.xml index ea12ba260..1694d3138 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -116,6 +116,7 @@ + diff --git a/core/app/build.gradle.kts b/core/app/build.gradle.kts index e78abdedc..84d5f83c8 100755 --- a/core/app/build.gradle.kts +++ b/core/app/build.gradle.kts @@ -87,6 +87,7 @@ dependencies { implementation(libs.common.retrofit.gson) implementation(libs.common.charts) implementation(libs.common.hiddenApiBypass) + implementation(libs.aapt2.common) implementation(libs.google.auto.service.annotations) implementation(libs.google.gson) diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/PlatformIndexService.kt b/core/app/src/main/java/com/itsaky/androidide/indexing/platform/PlatformIndexService.kt similarity index 75% rename from core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/PlatformIndexService.kt rename to core/app/src/main/java/com/itsaky/androidide/indexing/platform/PlatformIndexService.kt index af3fdb3f4..b1f9bb9c1 100644 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/PlatformIndexService.kt +++ b/core/app/src/main/java/com/itsaky/androidide/indexing/platform/PlatformIndexService.kt @@ -15,12 +15,12 @@ * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.indexing.core.internal.platform +package com.itsaky.androidide.indexing.platform import com.google.auto.service.AutoService import com.itsaky.androidide.indexing.IIndexService -import com.itsaky.androidide.progress.IProgressIndicator import com.itsaky.androidide.projects.api.Project +import org.slf4j.LoggerFactory import java.io.File /** @@ -29,19 +29,26 @@ import java.io.File @AutoService(IIndexService::class) internal class PlatformIndexService : IIndexService { + companion object { + private val log = LoggerFactory.getLogger(PlatformIndexService::class.java) + } + + override val displayName: String + get() = "Android Platform Indexing Service" + override fun scanFiles(project: Project): Collection { return mutableListOf().apply { project.findAndroidModules().forEach { androidModule -> - add(androidModule.getPlatformDir() ?: return@forEach) + add(androidModule.getPlatformDir()?.also { + log.debug("Adding {} to the list of indexable paths", it) + } ?: return@forEach) } } } override suspend fun indexFiles( project: Project, - progress: IProgressIndicator, files: Collection ) { - TODO("Not yet implemented") } } \ No newline at end of file diff --git a/core/app/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt b/core/app/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt index 1751bed94..492a151c6 100644 --- a/core/app/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt +++ b/core/app/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt @@ -33,7 +33,6 @@ import com.itsaky.androidide.projects.api.AndroidModule import com.itsaky.androidide.projects.api.ModuleProject import com.itsaky.androidide.projects.api.Project import com.itsaky.androidide.projects.builder.BuildService -import com.itsaky.androidide.projects.util.ProjectTransformer import com.itsaky.androidide.tasks.executeAsync import com.itsaky.androidide.tooling.api.IAndroidProject import com.itsaky.androidide.tooling.api.IProject diff --git a/core/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt b/core/app/src/main/java/com/itsaky/androidide/projects/ProjectTransformer.kt similarity index 99% rename from core/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt rename to core/app/src/main/java/com/itsaky/androidide/projects/ProjectTransformer.kt index 31d2db7c7..7c808fba6 100644 --- a/core/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt +++ b/core/app/src/main/java/com/itsaky/androidide/projects/ProjectTransformer.kt @@ -15,7 +15,7 @@ * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.projects.util +package com.itsaky.androidide.projects import com.itsaky.androidide.projects.api.AndroidModule import com.itsaky.androidide.projects.api.GradleProject diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/AbstractDBIndex.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/AbstractDBIndex.kt index bb1718e80..cb13321fb 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/AbstractDBIndex.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/AbstractDBIndex.kt @@ -25,9 +25,9 @@ import io.realm.Realm * @property params The index parameters. * @author Akash Yadav */ -abstract class AbstractDBIndex( +abstract class AbstractDBIndex( protected val params: IIndexParams? -) : IIndex { +) : IDatabaseIndex { protected abstract val realm: Realm diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IApiVersionsIndex.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IDatabaseIndex.kt similarity index 63% rename from core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IApiVersionsIndex.kt rename to core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IDatabaseIndex.kt index 344126c44..76dc71bac 100644 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IApiVersionsIndex.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IDatabaseIndex.kt @@ -15,20 +15,19 @@ * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.indexing.core.platform +package com.itsaky.androidide.indexing -import com.itsaky.androidide.indexing.IIndexParams -import com.itsaky.androidide.indexing.core.platform.IApiVersionsIndex.Params +import io.realm.RealmQuery /** - * Index which provides access to the API versions informations (`api-versions.xml`) from the - * Android SDK. + * An index which is stored in the database. * * @author Akash Yadav */ -interface IApiVersionsIndex : IPlatformIndex { +interface IDatabaseIndex : IIndex { - class Params( - val platformId: String - ) : IIndexParams + /** + * Perform a query on the Realm database. + */ + fun query(): RealmQuery } \ No newline at end of file diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndex.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndex.kt index f7aa0822f..e8d92968d 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndex.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndex.kt @@ -24,7 +24,7 @@ import com.itsaky.androidide.db.IRealmProvider * * @author Akash Yadav */ -interface IIndex { +interface IIndex { companion object { @@ -36,7 +36,7 @@ interface IIndex { /** * Base path for indices. */ - const val INDEX_BASE_PATH = "${IRealmProvider.PATH_SEPARATOR}index" + val INDEX_BASE_PATH = createIndexPath("", "index") private const val DEF_IS_ASYNC = true @@ -91,9 +91,9 @@ interface IIndex { * * @return The created sub-index. */ - fun createSubIndex( + fun createSubIndex( params: IIndexParams? = null - ): IIndex { + ): IIndex { throw UnsupportedOperationException() } diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexFactory.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexFactory.kt index 5d90387e0..29f4232b7 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexFactory.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexFactory.kt @@ -49,7 +49,7 @@ interface IIndexFactory { * @return The created [IIndex]. */ @Throws(NotFoundException::class) - fun create(): IIndex + fun create(): IIndex companion object { @@ -99,10 +99,10 @@ interface IIndexFactory { return factory } - val impls = ServiceLoader.load(symTyp).iterator() + val impls = ServiceLoader.load(IIndexFactory::class.java).iterator() while (impls.hasNext()) { val impl = impls.next() - if (impl is IIndexFactory<*, *> && symTyp == impl.indexableType()) { + if (symTyp == impl.indexableType()) { if (factory == null) { factory = impl as IIndexFactory continue diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexParams.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexParams.kt index 72334e44b..afdce49cd 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexParams.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexParams.kt @@ -18,7 +18,9 @@ package com.itsaky.androidide.indexing /** - * Index configuration + * Index configuration parameters. All implementations of this interface must implement the + * [Object.equals] and [Object.hashCode] methods properly as the parameters may be used to cache + * the index implementations in [IIndexFactory]s. * * @author Akash Yadav */ diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexService.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexService.kt index 87c44237e..05d51667f 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexService.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexService.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.indexing -import com.itsaky.androidide.progress.IProgressIndicator import com.itsaky.androidide.projects.api.Project import kotlinx.coroutines.Deferred import java.io.File @@ -29,6 +28,11 @@ import java.io.File */ interface IIndexService { + /** + * The display name of the service. + */ + val displayName: String + /** * Called to scan files that need to be indexed by this index service. * @@ -41,8 +45,7 @@ interface IIndexService { * Called to index the given files. * * @param project The root project model which can be used to query the project properties. - * @param progress An [IProgressIndicator] to report progress of the indexing process. * @param files The files to index. */ - suspend fun indexFiles(project: Project, progress: IProgressIndicator, files: Collection) + suspend fun indexFiles(project: Project, files: Collection) } \ No newline at end of file diff --git a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexable.kt b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexable.kt index bcdeed08e..667667471 100644 --- a/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexable.kt +++ b/core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexable.kt @@ -24,5 +24,4 @@ import io.realm.RealmModel * * @author Akash Yadav */ -interface IIndexable : RealmModel { -} \ No newline at end of file +interface IIndexable : RealmModel \ No newline at end of file diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/IndexingCoreRealmModule.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/IndexingCoreRealmModule.kt new file mode 100644 index 000000000..08f2f1b13 --- /dev/null +++ b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/IndexingCoreRealmModule.kt @@ -0,0 +1,26 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.indexing.core + +import io.realm.annotations.RealmModule + +/** + * @author Akash Yadav + */ +@RealmModule(classes = []) +class IndexingCoreRealmModule \ No newline at end of file diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexFactory.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexFactory.kt deleted file mode 100644 index ae5d928da..000000000 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexFactory.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.indexing.core.internal.platform - -import com.google.auto.service.AutoService -import com.itsaky.androidide.indexing.IIndex -import com.itsaky.androidide.indexing.IIndexFactory -import com.itsaky.androidide.indexing.core.platform.AbstractIndexFactory -import com.itsaky.androidide.indexing.core.platform.ClassOrMemberInfo -import com.itsaky.androidide.indexing.core.platform.IApiVersionsIndex.Params - -/** - * @author Akash Yadav - */ -@AutoService(IIndexFactory::class) -internal class ApiVersionsIndexFactory : AbstractIndexFactory() { - - override fun indexableType(): Class { - return ClassOrMemberInfo::class.java - } - - override fun paramType(): Class { - return Params::class.java - } - - override fun create(): IIndex { - return ApiVersionsIndexImpl.newInstance(params) - } -} \ No newline at end of file diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexImpl.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexImpl.kt deleted file mode 100644 index 2e320881a..000000000 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsIndexImpl.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.indexing.core.internal.platform - -import com.itsaky.androidide.db.IRealmProvider -import com.itsaky.androidide.indexing.AbstractDBIndex -import com.itsaky.androidide.indexing.core.platform.ClassOrMemberInfo -import com.itsaky.androidide.indexing.core.platform.IApiVersionsIndex -import com.itsaky.androidide.indexing.core.platform.IPlatformIndex -import io.realm.Realm - -/** - * Index to store [ClassOrMemberInfo]. - * - * @author Akash Yadav - */ -internal class ApiVersionsIndexImpl private constructor(params: IApiVersionsIndex.Params?) : - AbstractDBIndex(params), - IApiVersionsIndex { - - companion object { - private const val NAME = "member-info" - private val PATH = IRealmProvider.createPath(IPlatformIndex.PLATFORM_INDEX_BASE_PATH, NAME) - - @JvmStatic - fun newInstance(params: IApiVersionsIndex.Params?) = ApiVersionsIndexImpl(params) - } - - override val name: String = NAME - override val path: String = PATH - - override val realm: Realm by lazy { - val provider = IRealmProvider.instance() - provider.get(path) - } -} \ No newline at end of file diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsParser.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsParser.kt index fce8d95c8..ecae1a6f5 100644 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsParser.kt +++ b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/internal/platform/ApiVersionsParser.kt @@ -70,8 +70,15 @@ open class ApiVersionsParser { consumeEndElement(event.asEndElement()) } } + + onFinishParse() } + /** + * Called when the parser is done parsing the `api-versions.xml` file. + */ + protected open fun onFinishParse() {} + private fun consumeStartElement(event: StartElement) { when (event.name.localPart) { "api" -> apiVersion = event.getAttributeByName(QName("version")).value.toInt() @@ -110,6 +117,12 @@ open class ApiVersionsParser { return false } + /** + * Consume [ApiVersion] info of a class. + * + * @param name The fully qualified name of the class in its internal form. + * @param apiVersion The [ApiVersion] info of the class. + */ protected open fun consumeClassVersionInfo(name: String, apiVersion: ApiVersion) {} private fun consumeMember(event: StartElement, memberType: String) { @@ -130,6 +143,14 @@ open class ApiVersionsParser { return false } + /** + * Consume [ApiVersion] info for a member of a class. + * + * @param className The name of the class which declares this member. + * @param member The identifier of the member. This is the name of the field and the method signature for methods. + * @param memberType The type of member. This may be "field" or "method". + * @param apiVersion The [ApiVersion] info. + */ protected open fun consumeMemberVersionInfo( className: String, member: String, diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/ClassOrMemberInfo.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/ClassOrMemberInfo.kt deleted file mode 100644 index cbf01f1b9..000000000 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/ClassOrMemberInfo.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.indexing.core.platform - -import io.realm.annotations.RealmField -import io.realm.annotations.Required - -/** - * [ApiVersion] of a class or class members. - * - * @property className The fully qualified name of the class. - * @property memberName The name of the member (optional). Must be set if the objects represents API - * information about a member of a class. Otherwise, it could be `null`. - * @property apiVersion The [ApiVersion] about the class or the member. - * - * @author Akash Yadav - */ -open class ClassOrMemberInfo : IPlatformIndexable { - - @Required - @RealmField("className") - var className: String? = null - - @Required - @RealmField("memberName") - var memberName: String? = null - - @Required - @RealmField("apiVersion") - var apiVersion: ApiVersion? = null - - fun isMember(): Boolean = !isClass() - fun isClass(): Boolean = this.memberName == null -} \ No newline at end of file diff --git a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IPlatformIndex.kt b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IPlatformIndex.kt index d4aa51e1b..a9bf94ab1 100644 --- a/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IPlatformIndex.kt +++ b/core/indexing-core/src/main/java/com/itsaky/androidide/indexing/core/platform/IPlatformIndex.kt @@ -17,22 +17,20 @@ package com.itsaky.androidide.indexing.core.platform -import com.itsaky.androidide.db.IRealmProvider import com.itsaky.androidide.indexing.IIndex -import com.itsaky.androidide.indexing.IIndexParams /** * Index for data available in the Android Platform SDK. * * @author Akash Yadav */ -interface IPlatformIndex : IIndex { +interface IPlatformIndex : IIndex { companion object { /** * Base path for the platform index. */ - val PLATFORM_INDEX_BASE_PATH = IRealmProvider.createPath(IIndex.INDEX_BASE_PATH, "platform") + val PLATFORM_INDEX_BASE_PATH = IIndex.createIndexPath(IIndex.INDEX_BASE_PATH, "platform") } } \ No newline at end of file diff --git a/core/indexing-core/src/test/java/com/itsaky/androidide/indexing/core/platform/CollectingApiVersionsParser.kt b/core/indexing-core/src/test/java/com/itsaky/androidide/indexing/core/platform/CollectingApiVersionsParser.kt index f34548c8f..54e0ec378 100644 --- a/core/indexing-core/src/test/java/com/itsaky/androidide/indexing/core/platform/CollectingApiVersionsParser.kt +++ b/core/indexing-core/src/test/java/com/itsaky/androidide/indexing/core/platform/CollectingApiVersionsParser.kt @@ -17,12 +17,12 @@ package com.itsaky.androidide.indexing.core.platform -import com.itsaky.androidide.indexing.core.internal.platform.ApiVersionsParser +import com.itsaky.androidide.indexing.platform.ApiVersionsParser /** * @author Akash Yadav */ -class CollectingApiVersionsParser : ApiVersionsParser() { +class CollectingApiVersionsParser : com.itsaky.androidide.indexing.platform.ApiVersionsParser() { private val apiInfo = mutableMapOf>>() diff --git a/java/lsp/src/main/java/com/itsaky/androidide/lsp/java/indexing/internal/JavaIndexServiceImpl.kt b/java/lsp/src/main/java/com/itsaky/androidide/lsp/java/indexing/internal/JavaIndexServiceImpl.kt index 533ef1db3..899b312d0 100644 --- a/java/lsp/src/main/java/com/itsaky/androidide/lsp/java/indexing/internal/JavaIndexServiceImpl.kt +++ b/java/lsp/src/main/java/com/itsaky/androidide/lsp/java/indexing/internal/JavaIndexServiceImpl.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.lsp.java.indexing.internal import com.google.auto.service.AutoService import com.itsaky.androidide.indexing.IIndexService -import com.itsaky.androidide.progress.IProgressIndicator import com.itsaky.androidide.projects.api.Project import java.io.File @@ -29,13 +28,15 @@ import java.io.File @AutoService(IIndexService::class) internal class JavaIndexServiceImpl : IIndexService { + override val displayName: String + get() = "Java LSP Indexing Service" + override fun scanFiles(project: Project): Collection { return emptySet() } override suspend fun indexFiles( project: Project, - progress: IProgressIndicator, files: Collection ) { }