package com.cedricziel.idea.typo3.container; import com.cedricziel.idea.typo3.domain.TYPO3ServiceDefinition; import com.cedricziel.idea.typo3.psi.visitor.CoreServiceDefinitionParserVisitor; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.FileTypeIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.indexing.FileBasedIndex; import com.jetbrains.php.lang.PhpFileType; import java.util.*; /** * Parses the core services to a map. Core Services are not traditional * services in a DIC, but rather named elements in a service locator. */ public class CoreServiceParser { private HashMap<String, ArrayList<TYPO3ServiceDefinition>> serviceMap; public CoreServiceParser() { this.serviceMap = new HashMap<>(); } private void collectServices(Project project) { FileBasedIndex index = FileBasedIndex.getInstance(); Collection<VirtualFile> containingFiles = index.getContainingFiles( FileTypeIndex.NAME, PhpFileType.INSTANCE, GlobalSearchScope.allScope(project) ); containingFiles.removeIf(virtualFile -> !(virtualFile.getName().contains("ext_localconf.php"))); for (VirtualFile projectFile : containingFiles) { PsiFile psiFile = PsiManager.getInstance(project).findFile(projectFile); if (psiFile != null) { psiFile.accept(new CoreServiceDefinitionParserVisitor(serviceMap)); } } } public Boolean has(Project project, String serviceId) { return this.serviceMap.containsKey(serviceId); } public List<TYPO3ServiceDefinition> resolve(Project project, String serviceId) { return this.serviceMap.get(serviceId); } public void collect(Project project) { collectServices(project); } }