void (@NotNull VirtualFile parent, @NotNull String name, @Nullable FileAttributes attributes, @Nullable String symlinkTarget, boolean isEmptyDirectory) { NewVirtualFileSystem fs = getFileSystem(parent); int parentId = getFileId(parent); Pair<@NotNull FileAttributes, String> childData = getChildData(fs, parent, name, attributes, symlinkTarget); if (childData == null) { return; } ChildInfo childInfo = makeChildRecord(parent, parentId, name, childData, fs, null); vfsPeer.update(parent, parentId, children -> { // check that names are not duplicated ChildInfo duplicate = findExistingChildInfo(parent, name, children.children); if (duplicate != null) return children; return children.insert(childInfo); }); int childId = childInfo.getId(); assert parent instanceof VirtualDirectoryImpl : parent; VirtualDirectoryImpl dir = (VirtualDirectoryImpl)parent; int nameId = vfsPeer.getNameId(name); VirtualFileSystemEntry child = dir.createChild(childId, nameId, fileAttributesToFlags(childData.first), isEmptyDirectory ); if (isEmptyDirectory) { // When creating an empty directory, we need to make sure every file created inside will fire a "file-created" event, // in order to `VirtualFilePointerManager` get those events to update its pointers properly // (because currently it ignores empty directory creation events for performance reasons). setChildrenCached(childId); } dir.addChild(child); incStructuralModificationCount(); }