Skip to content

Commit

Permalink
basic support for composer packages (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
Danil42Russia authored Feb 13, 2023
1 parent 590b725 commit 36b7c72
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 24 deletions.
10 changes: 2 additions & 8 deletions src/main/kotlin/com/vk/modulite/composer/ComposerPackage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,15 @@ data class ComposerPackage(
override fun toString() = name

companion object {
fun fromPsiFile(file: JsonFile): ComposerPackage? {
fun fromPsiFile(file: JsonFile): ComposerPackage {
val values = file.getPropertiesValues()
var name = ""
var description = ""
var isPackage = false
var exportList = emptyList<SymbolName>()
var namespace = ""
var moduliteEnabled = false
values.forEach {
when (it.name) {
"type" -> {
isPackage = it.value?.text?.unquote() == "library"
}
"name" -> {
name = it.value?.text?.unquote() ?: ""
}
Expand Down Expand Up @@ -86,9 +82,7 @@ data class ComposerPackage(
}
}
}
if (!isPackage) {
return null
}

return ComposerPackage(
"#$name",
description,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import com.vk.modulite.modulite.ModuliteRestrictionChecker
import com.vk.modulite.psi.extensions.files.containingModulite
import com.vk.modulite.utils.fromStubs
import com.vk.modulite.utils.fromTests
import com.vk.modulite.utils.fromVendor

class ModulitePhpAnnotator : Annotator {
companion object {
Expand Down Expand Up @@ -55,7 +54,7 @@ class ModulitePhpAnnotator : Annotator {

val filteredReferences = references.filter {
val file = it.containingFile.virtualFile
!file.fromTests() && !file.fromVendor() && !file.fromStubs() && it !is PhpNamespace
!file.fromTests() && !file.fromStubs() && it !is PhpNamespace
}

val problemPsiElement = problemElement ?: reference
Expand Down
28 changes: 22 additions & 6 deletions src/main/kotlin/com/vk/modulite/index/ComposerFilesIndex.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ import com.intellij.util.io.KeyDescriptor
import com.vk.modulite.Namespace
import com.vk.modulite.SymbolName
import com.vk.modulite.composer.ComposerPackage
import gnu.trove.THashMap
import com.vk.modulite.utils.fromKphpPolyfills
import com.vk.modulite.utils.fromPackages
import com.vk.modulite.utils.fromVendor
import java.io.DataInput
import java.io.DataOutput

class ComposerFilesIndex : FileBasedIndexExtension<String, ComposerPackage>() {
override fun getIndexer(): DataIndexer<String, ComposerPackage, FileContent> {
return DataIndexer { inputData ->
val map = THashMap<String, ComposerPackage>()
val map = hashMapOf<String, ComposerPackage>()

val model = ComposerPackage.fromPsiFile(inputData.psiFile as JsonFile)
if (model != null) {
map[model.name] = model
}
map[model.name] = model

map
}
Expand Down Expand Up @@ -65,7 +65,23 @@ class ComposerFilesIndex : FileBasedIndexExtension<String, ComposerPackage>() {
}
}

override fun getInputFilter() = FileBasedIndex.InputFilter { file -> file.name == "composer.json" }
override fun getInputFilter(): FileBasedIndex.InputFilter {
return FileBasedIndex.InputFilter { file ->
if (file.name != "composer.json") {
return@InputFilter false
}

// Перенести проверку в логику
if (file.fromKphpPolyfills()) {
return@InputFilter false
}

// Не оптимальный вариант.
// На самом деле это защита, он индексирования composer текущего проекта.
return@InputFilter file.fromVendor() || file.fromPackages()
}
}

override fun getName() = KEY
override fun getKeyDescriptor(): KeyDescriptor<String> = EnumeratorStringDescriptor.INSTANCE
override fun dependsOnFileContent() = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import com.vk.modulite.psi.extensions.files.containingModulite
import com.vk.modulite.psi.extensions.php.symbolName
import com.vk.modulite.utils.fromStubs
import com.vk.modulite.utils.fromTests
import com.vk.modulite.utils.fromVendor
import com.vk.modulite.utils.registerModuliteProblem

class InternalSymbolUsageInspection : LocalInspectionTool() {
Expand Down Expand Up @@ -132,7 +131,7 @@ class InternalSymbolUsageInspection : LocalInspectionTool() {

val filteredReferences = references.filter {
val file = it.containingFile.virtualFile
!file.fromTests() && !file.fromVendor() && !file.fromStubs() && it !is PhpNamespace
!file.fromTests() && !file.fromStubs() && it !is PhpNamespace
}

val problemPsiElement = problemElement ?: reference
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import com.vk.modulite.psi.extensions.files.containingModulite
import com.vk.modulite.psi.extensions.php.symbolName
import com.vk.modulite.utils.fromKphpPolyfills
import com.vk.modulite.utils.fromStubs
import com.vk.modulite.utils.fromVendor

object ModuliteRestrictionChecker {
enum class ViolationTypes {
Expand Down Expand Up @@ -112,7 +111,7 @@ object ModuliteRestrictionChecker {

// Не проверяем использования символов, которые определены в
// стабах или являются сторонними.
if (file.fromStubs() || file.fromVendor() || file.fromKphpPolyfills()) {
if (file.fromStubs() || file.fromKphpPolyfills()) {
return result(ViolationTypes.Ok)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import com.vk.modulite.psi.PhpRecursiveElementVisitor
import com.vk.modulite.psi.extensions.files.*
import com.vk.modulite.psi.extensions.php.safeFqn
import com.vk.modulite.psi.extensions.php.symbolName
import com.vk.modulite.utils.fromKphpPolyfills
import com.vk.modulite.utils.fromStubs
import com.vk.modulite.utils.fromTests
import com.vk.modulite.utils.fromVendor

class ModuliteDepsDiff(
private val project: Project,
Expand Down Expand Up @@ -366,8 +366,8 @@ class ModuliteDependenciesCollector(val project: Project) {
// Если ссылка ссылается на символ из этих папок, то нам не
// нужно добавлять их в зависимости модуля, так как это не
// пользовательский код.
if (containingFile.fromStubs() || containingFile.fromVendor() || containingFile.fromTests()) {
LOG.warn("${reference.fqn} from stubs/vendor/tests")
if (containingFile.fromStubs() || containingFile.fromKphpPolyfills() || containingFile.fromTests()) {
LOG.warn("${reference.fqn} from stubs/kphp-polyfill/tests")
return true
}

Expand Down
6 changes: 5 additions & 1 deletion src/main/kotlin/com/vk/modulite/utils/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,17 @@ fun VirtualFile.fromVendor(): Boolean {
}

fun VirtualFile.fromTests(): Boolean {
return path.contains("/tests/")
return path.contains("/tests/") || path.contains("/Tests/")
}

fun VirtualFile.fromKphpPolyfills(): Boolean {
return path.contains("/kphp-polyfills/")
}

fun VirtualFile.fromPackages(): Boolean {
return path.contains("/packages/")
}

inline fun <reified T : PsiElement> PsiElement.childOfType(): T? {
var found: T? = null
PsiTreeUtil.processElements(this) {
Expand Down

0 comments on commit 36b7c72

Please sign in to comment.