@TestOnly private static void assertAccessInTests( @NotNull VirtualFileSystemEntry child, @NotNull NewVirtualFileSystem delegate) { final Application application = ApplicationManager.getApplication(); if (IS_UNDER_TEAMCITY && SHOULD_PERFORM_ACCESS_CHECK && application.isUnitTestMode() && application instanceof ApplicationImpl && ((ApplicationImpl) application).isComponentsCreated()) { if (delegate != LocalFileSystem.getInstance() && delegate != JarFileSystem.getInstance()) { return; } // root' children are loaded always if (child.getParent() == null || child.getParent().getParent() == null) return; Set<String> allowed = allowedRoots(); boolean isUnder = allowed == null; if (!isUnder) { String childPath = child.getPath(); if (delegate == JarFileSystem.getInstance()) { VirtualFile local = JarFileSystem.getInstance().getVirtualFileForJar(child); assert local != null : child; childPath = local.getPath(); } for (String root : allowed) { if (FileUtil.startsWith(childPath, root)) { isUnder = true; break; } if (root.startsWith(JarFileSystem.PROTOCOL_PREFIX)) { String rootLocalPath = FileUtil.toSystemIndependentName(PathUtil.toPresentableUrl(root)); isUnder = FileUtil.startsWith(childPath, rootLocalPath); if (isUnder) break; } } } assert isUnder || allowed.isEmpty() : "File accessed outside allowed roots: " + child + ";\nAllowed roots: " + new ArrayList<String>(allowed); } }
@NotNull public static IFile virtualToIFile(@NotNull VirtualFile file) { return FileSystem.FILE_SYSTEM.createFile(PathUtil.toPresentableUrl(file.getUrl())); }
/** * @param path target path * @return absolute path that points to the same location as the given one and that uses only * slashes */ @NotNull public static String toCanonicalPath(@NotNull String path) { String p = normalizePath(new File(path).getAbsolutePath()); assert p != null; return PathUtil.getCanonicalPath(p); }
private void doCompile( CompileContext compileContext, Chunk<Module> moduleChunk, List<VirtualFile> files, Module module, boolean tests) { if (files.isEmpty()) return; VirtualFile mainOutput = compileContext.getModuleOutputDirectory(module); final VirtualFile outputDir = tests ? compileContext.getModuleOutputDirectoryForTests(module) : mainOutput; if (outputDir == null) { compileContext.addMessage(ERROR, "[Internal Error] No output directory", "", -1, -1); return; } File kotlinHome = PathUtil.getDefaultCompilerPath(); if (kotlinHome == null) { compileContext.addMessage( ERROR, "Cannot find kotlinc home. Make sure plugin is properly installed", "", -1, -1); return; } ModuleChunk chunk = new ModuleChunk( (CompileContextEx) compileContext, moduleChunk, Collections.<Module, List<VirtualFile>>emptyMap()); String moduleName = moduleChunk.getNodes().iterator().next().getName(); // Filter the output we are writing to Set<VirtualFile> outputDirectoriesToFilter = Sets.newHashSet(compileContext.getModuleOutputDirectoryForTests(module)); if (!tests) { outputDirectoriesToFilter.add(compileContext.getModuleOutputDirectory(module)); } CharSequence script = generateModuleScript( moduleName, chunk, files, tests, mainOutput, outputDirectoriesToFilter); File scriptFile = new File(path(outputDir), "script.kts"); try { FileUtil.writeToFile(scriptFile, script.toString()); } catch (IOException e) { compileContext.addMessage( ERROR, "[Internal Error] Cannot write script to " + scriptFile.getAbsolutePath(), "", -1, -1); return; } if (RUN_OUT_OF_PROCESS) { runOutOfProcess(compileContext, outputDir, kotlinHome, scriptFile); } else { runInProcess(compileContext, outputDir, kotlinHome, scriptFile); } // compileContext.addMessage(INFORMATION, "Generated module script:\n" + // script.toString(), "file://" + path(mainOutput), 0, 1); }