@@ -27,6 +27,7 @@ import com.magento.idea.magento2plugin.magento.packages.Package
2727import com.magento.idea.magento2plugin.project.Settings
2828import com.magento.idea.magento2plugin.util.CamelCaseToHyphen
2929import java.nio.file.Paths
30+ import java.nio.file.InvalidPathException
3031import java.util.concurrent.atomic.AtomicReference
3132
3233internal object MagentoModuleCommands {
@@ -73,9 +74,6 @@ internal object MagentoModuleCommands {
7374 ? : return " Configured Magento root path \" $configuredRoot \" could not be resolved."
7475
7576 val moduleFullName = " ${normalizedPackage} _${normalizedModule} "
76- if (ModuleIndex (project).getModuleDirectoryByModuleName(moduleFullName) != null ) {
77- return " Magento module \" $moduleFullName \" already exists."
78- }
7977
8078 val existingModuleDirectory = ReadAction .compute<PsiDirectory ?, RuntimeException > {
8179 magentoRootDirectory.findSubdirectory(" app" )
@@ -268,18 +266,52 @@ internal object MagentoModuleCommands {
268266 }
269267
270268 private fun refreshCreatedModuleTree (vararg directories : PsiDirectory ) {
271- val virtualFiles = directories.map { it.virtualFile }.toTypedArray()
269+ val virtualFiles = directories.map { it.virtualFile }
270+ .filter { it.isValid }
271+ .toTypedArray()
272272 VfsUtil .markDirtyAndRefresh(false , true , true , * virtualFiles)
273+ virtualFiles.forEach { it.refresh(false , true ) }
273274 }
274275
275276 private fun resolveMagentoRootDirectory (project : Project , configuredRoot : String ): PsiDirectory ? {
276277 return ReadAction .compute<PsiDirectory ?, RuntimeException > {
277278 val fileSystem = LocalFileSystem .getInstance()
278- val candidates = linkedSetOf(configuredRoot)
279+ val normalizedConfiguredRoot = FileUtil .toSystemIndependentName(configuredRoot.trim())
280+
281+ if (isAbsolutePath(normalizedConfiguredRoot)) {
282+ val absoluteVirtualFile = fileSystem.refreshAndFindFileByPath(normalizedConfiguredRoot)
283+ ? : fileSystem.findFileByPath(normalizedConfiguredRoot)
284+ if (absoluteVirtualFile != null && absoluteVirtualFile.isDirectory) {
285+ return @compute PsiManager .getInstance(project).findDirectory(absoluteVirtualFile)
286+ }
287+ }
288+
289+ val moduleIndex = ModuleIndex (project)
290+ val configuredRootTrimmed = normalizedConfiguredRoot.trim(' /' ).replace(' \\ ' , ' /' )
291+ val configuredPrefix = normalizedConfiguredRoot.trimEnd(' /' ) + " /" + Package .packagesRoot + " /"
292+ for (moduleName in moduleIndex.moduleNames) {
293+ val moduleDirectory = moduleIndex.getModuleDirectoryByModuleName(moduleName) ? : continue
294+ val modulePath = moduleDirectory.virtualFile.path.replace(' \\ ' , ' /' )
295+
296+ val resolvedRoot = moduleDirectory.parentDirectory(levels = 4 ) ? : continue
297+ val resolvedRootPath = resolvedRoot.virtualFile.path.replace(' \\ ' , ' /' )
298+ if (modulePath.startsWith(configuredPrefix)) {
299+ return @compute resolvedRoot
300+ }
301+
302+ if (! isAbsolutePath(normalizedConfiguredRoot) &&
303+ configuredRootTrimmed.isNotEmpty() &&
304+ resolvedRootPath.endsWith(" /$configuredRootTrimmed " )
305+ ) {
306+ return @compute resolvedRoot
307+ }
308+ }
309+
310+ val candidates = linkedSetOf(normalizedConfiguredRoot)
279311 val basePath = project.basePath
280312 if (basePath != null ) {
281- candidates + = Paths .get(basePath, configuredRoot .removePrefix(" /" )).normalize().toString()
282- candidates + = Paths .get(basePath, configuredRoot ).normalize().toString()
313+ candidates + = Paths .get(basePath, normalizedConfiguredRoot .removePrefix(" /" )).normalize().toString()
314+ candidates + = Paths .get(basePath, normalizedConfiguredRoot ).normalize().toString()
283315 }
284316
285317 val virtualFile = candidates.asSequence()
@@ -290,22 +322,18 @@ internal object MagentoModuleCommands {
290322 return @compute PsiManager .getInstance(project).findDirectory(virtualFile)
291323 }
292324
293- val configuredPrefix = configuredRoot.trimEnd(' /' ) + " /" + Package .packagesRoot + " /"
294- val moduleIndex = ModuleIndex (project)
295- for (moduleName in moduleIndex.moduleNames) {
296- val moduleDirectory = moduleIndex.getModuleDirectoryByModuleName(moduleName) ? : continue
297- val modulePath = moduleDirectory.virtualFile.path.replace(' \\ ' , ' /' )
298- if (! modulePath.startsWith(configuredPrefix)) {
299- continue
300- }
301-
302- return @compute moduleDirectory.parentDirectory(levels = 4 )
303- }
304-
305325 null
306326 }
307327 }
308328
329+ private fun isAbsolutePath (path : String ): Boolean {
330+ return try {
331+ Paths .get(path).isAbsolute
332+ } catch (_: InvalidPathException ) {
333+ false
334+ }
335+ }
336+
309337 private fun PsiDirectory.parentDirectory (levels : Int ): PsiDirectory ? {
310338 var current: PsiDirectory ? = this
311339 repeat(levels) {
0 commit comments