@Nullable public VirtualFile getPackageDirIfLivePackageOrFromPubListPackageDirs( @NotNull final String packageName, @Nullable final String pathRelToPackageDir) { final VirtualFile dir = myLivePackageNameToDirMap.get(packageName); if (dir != null) return dir; final Set<String> dirPaths = myPubListPackageDirsMap.get(packageName); if (dirPaths != null) { VirtualFile notNullPackageDir = null; for (String dirPath : dirPaths) { final VirtualFile packageDir = ApplicationManager.getApplication().isUnitTestMode() ? TempFileSystem.getInstance().findFileByPath(dirPath) : LocalFileSystem.getInstance().findFileByPath(dirPath); if (notNullPackageDir == null && packageDir != null) { notNullPackageDir = packageDir; } if (packageDir != null && (StringUtil.isEmpty(pathRelToPackageDir) || packageDir.findFileByRelativePath(pathRelToPackageDir) != null)) { return packageDir; } } return notNullPackageDir; // file by pathRelToPackageDir was not found, but not-null // packageDir still may be useful } return null; }
@Nullable public ProblemDescriptor[] checkFile( @NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { if (InjectedLanguageManager.getInstance(file.getProject()).isInjectedFragment(file)) return null; if (ArrayUtil.find(file.getPsiRoots(), file) != 0) return null; if (!file.isPhysical()) return null; VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null) return null; if (virtualFile.getFileSystem() != LocalFileSystem.getInstance() // tests && virtualFile.getFileSystem() != TempFileSystem.getInstance()) return null; String text = file.getText(); Charset charset = LoadTextUtil.extractCharsetFromFileContent(file.getProject(), virtualFile, text); // no sense in checking transparently decoded file: all characters there are already safely // encoded if (charset instanceof Native2AsciiCharset) return null; List<ProblemDescriptor> descriptors = new SmartList<ProblemDescriptor>(); checkIfCharactersWillBeLostAfterSave(file, manager, isOnTheFly, text, charset, descriptors); checkFileLoadedInWrongEncoding(file, manager, isOnTheFly, virtualFile, charset, descriptors); return descriptors.toArray(new ProblemDescriptor[descriptors.size()]); }
@NotNull private VirtualFilePointer create( @Nullable VirtualFile file, @NotNull String url, @NotNull final Disposable parentDisposable, @Nullable VirtualFilePointerListener listener) { String protocol; VirtualFileSystem fileSystem; if (file == null) { protocol = VirtualFileManager.extractProtocol(url); fileSystem = myVirtualFileManager.getFileSystem(protocol); } else { protocol = null; fileSystem = file.getFileSystem(); } if (fileSystem == TempFileSystem.getInstance()) { // for tests, recreate always since VirtualFile found = fileSystem == null ? null : file != null ? file : VirtualFileManager.getInstance().findFileByUrl(url); return new IdentityVirtualFilePointer(found, url); } if (fileSystem != LocalFileSystem.getInstance() && fileSystem != JarFileSystem.getInstance()) { // we are unable to track alien file systems for now VirtualFile found = fileSystem == null ? null : file != null ? file : VirtualFileManager.getInstance().findFileByUrl(url); // if file is null, this pointer will never be alive return getOrCreateIdentity(url, found); } String path; if (file == null) { path = VirtualFileManager.extractPath(url); path = cleanupPath(path, protocol); url = VirtualFileManager.constructUrl(protocol, path); } else { path = file.getPath(); // url has come from VirtualFile.getUrl() and is good enough } VirtualFilePointerImpl pointer = getOrCreate(file, url, parentDisposable, listener, path); int newCount = pointer.incrementUsageCount(); if (newCount == 1) { Disposer.register(parentDisposable, pointer); } else { // already registered register(parentDisposable, pointer); } return pointer; }
@Nullable public VirtualFile findFileByDartUrl(final @NotNull String url) { if (url.startsWith(DART_PREFIX)) { return findFileInDartSdkLibFolder(myProject, myDartSdk, url); } if (url.startsWith(PACKAGE_PREFIX)) { final String packageRelPath = url.substring(PACKAGE_PREFIX.length()); final int slashIndex = packageRelPath.indexOf('/'); final String packageName = slashIndex > 0 ? packageRelPath.substring(0, slashIndex) : packageRelPath; final String pathRelToPackageDir = slashIndex > 0 ? packageRelPath.substring(slashIndex + 1) : ""; final VirtualFile packageDir = StringUtil.isEmpty(packageName) ? null : myLivePackageNameToDirMap.get(packageName); if (packageDir != null) { return packageDir.findFileByRelativePath(pathRelToPackageDir); } for (final VirtualFile packageRoot : myPackageRoots) { final VirtualFile file = packageRoot.findFileByRelativePath(packageRelPath); if (file != null) { return file; } } final Set<String> packageDirs = myPubListPackageDirsMap.get(packageName); if (packageDirs != null) { for (String packageDirPath : packageDirs) { final VirtualFile file = LocalFileSystem.getInstance() .findFileByPath(packageDirPath + "/" + pathRelToPackageDir); if (file != null) { return file; } } } } if (url.startsWith(FILE_PREFIX)) { final String path = StringUtil.trimLeading(url.substring(FILE_PREFIX.length()), '/'); return LocalFileSystem.getInstance() .findFileByPath(SystemInfo.isWindows ? path : ("/" + path)); } if (ApplicationManager.getApplication().isUnitTestMode() && url.startsWith(TEMP_PREFIX)) { return TempFileSystem.getInstance().findFileByPath(url.substring((TEMP_PREFIX).length())); } return null; }
@Nullable private static VirtualFile getByFullPath(String filePath) { final VirtualFile fileByPath = LocalFileSystem.getInstance().findFileByPath(filePath); if (fileByPath != null) { return fileByPath; } // if we are in UnitTest mode probably TempFileSystem is used instead of LocalFileSystem if (ApplicationManager.getApplication().isUnitTestMode()) { return TempFileSystem.getInstance().findFileByPath(filePath); } return null; }
@SuppressWarnings("UnsafeVfsRecursion") public static void assertDirectoriesEqual( VirtualFile dirAfter, VirtualFile dirBefore, @Nullable VirtualFileFilter fileFilter) throws IOException { FileDocumentManager.getInstance().saveAllDocuments(); VirtualFile[] childrenAfter = dirAfter.getChildren(); if (dirAfter.isInLocalFileSystem() && dirAfter.getFileSystem() != TempFileSystem.getInstance()) { File[] ioAfter = new File(dirAfter.getPath()).listFiles(); shallowCompare(childrenAfter, ioAfter); } VirtualFile[] childrenBefore = dirBefore.getChildren(); if (dirBefore.isInLocalFileSystem() && dirBefore.getFileSystem() != TempFileSystem.getInstance()) { File[] ioBefore = new File(dirBefore.getPath()).listFiles(); shallowCompare(childrenBefore, ioBefore); } HashMap<String, VirtualFile> mapAfter = buildNameToFileMap(childrenAfter, fileFilter); HashMap<String, VirtualFile> mapBefore = buildNameToFileMap(childrenBefore, fileFilter); Set<String> keySetAfter = mapAfter.keySet(); Set<String> keySetBefore = mapBefore.keySet(); assertEquals(dirAfter.getPath(), keySetAfter, keySetBefore); for (String name : keySetAfter) { VirtualFile fileAfter = mapAfter.get(name); VirtualFile fileBefore = mapBefore.get(name); if (fileAfter.isDirectory()) { assertDirectoriesEqual(fileAfter, fileBefore, fileFilter); } else { assertFilesEqual(fileAfter, fileBefore); } } }