@Override public VirtualFile[] getSourceRoots(Module module) { VirtualFile[] cachedRoots = myModuleToRootsCache.get(module); if (cachedRoots != null) { if (areFilesValid(cachedRoots)) { return cachedRoots; } else { myModuleToRootsCache.remove( module); // clear cache for this module and rebuild list of roots } } Set<VirtualFile> additionalRoots = myModuleToRootsMap.get(module); VirtualFile[] moduleRoots = ModuleRootManager.getInstance(module).getSourceRoots(); if (additionalRoots == null || additionalRoots.isEmpty()) { myModuleToRootsCache.put(module, moduleRoots); return moduleRoots; } final VirtualFile[] allRoots = new VirtualFile[additionalRoots.size() + moduleRoots.length]; System.arraycopy(moduleRoots, 0, allRoots, 0, moduleRoots.length); int index = moduleRoots.length; for (final VirtualFile additionalRoot : additionalRoots) { allRoots[index++] = additionalRoot; } myModuleToRootsCache.put(module, allRoots); return allRoots; }