fix: various fixes on vfs

This commit is contained in:
zaaarf 2024-09-14 23:28:16 +02:00
parent c7b9594c11
commit 44d5c77383
No known key found for this signature in database
GPG key ID: C91CFF9E2262BBA1
8 changed files with 136 additions and 43 deletions

View file

@ -45,7 +45,7 @@ public class FileUtil {
return CodeMP.getClient("buffer access")
.getWorkspace(path.getWorkspaceName())
.flatMap(ws -> {
String[] matches = ws.getFileTree(Optional.of(path.getRealPath()));
String[] matches = ws.getFileTree(Optional.of(path.getRealPath()), true);
if(matches.length == 0) return Optional.empty();
Optional<BufferController> controller = ws.getBuffer(path.getRealPath());
if(controller.isPresent()) return controller;

View file

@ -1,6 +1,5 @@
package mp.code.intellij.vfs;
import com.intellij.openapi.vfs.VirtualFile;
import lombok.Getter;
import mp.code.intellij.CodeMP;
import org.jetbrains.annotations.NotNull;
@ -13,10 +12,10 @@ import java.util.Arrays;
import java.util.Optional;
@Getter
public class CodeMPFolder extends CodeMPFile {
public class CodeMPDirectory extends CodeMPFile {
public CodeMPFolder(CodeMPFileSystem fileSystem, CodeMPPath path) {
super(fileSystem, path);
public CodeMPDirectory(CodeMPFileSystem fileSystem, CodeMPPath path) {
super(fileSystem, path, true);
}
@Override
@ -39,7 +38,7 @@ public class CodeMPFolder extends CodeMPFile {
return CodeMP.getClient("get folder children")
.getWorkspace(this.path.getWorkspaceName())
.map(ws ->
Arrays.stream(ws.getFileTree(Optional.of(this.path.getRealPath())))
Arrays.stream(ws.getFileTree(Optional.of(this.path.getRealPath()), false))
.map(p -> new CodeMPPath(this.path.getWorkspaceName(), p))
.map(CodeMPPath::join)
.map(this.fileSystem::findFileByPath)
@ -80,4 +79,5 @@ public class CodeMPFolder extends CodeMPFile {
public @NotNull InputStream getInputStream() throws IOException {
throw new RuntimeException("WHAT FOLDER INPUT");
}
}

View file

@ -1,7 +1,8 @@
package mp.code.intellij.vfs;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.ide.projectView.impl.ProjectTreeStructure;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileWithId;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import mp.code.exceptions.ControllerException;
@ -22,9 +23,14 @@ import java.util.Optional;
public class CodeMPFile extends VirtualFile {
protected final CodeMPFileSystem fileSystem;
protected final CodeMPPath path;
protected final boolean isDirectory; // TODO exists ONLY for ez debugging, remove afterwards
public CodeMPFile(CodeMPFileSystem fs, CodeMPPath p) {
this(fs, p, false);
}
@Override
public @NotNull @NlsSafe String getName() {
public @NotNull String getName() {
return this.path.getFileName();
}
@ -47,15 +53,15 @@ public class CodeMPFile extends VirtualFile {
public boolean isValid() {
return CodeMP.getClient("validity check")
.getWorkspace(this.path.getWorkspaceName())
.map(ws -> ws.getFileTree(Optional.of(this.path.getRealPath())))
.map(ws -> ws.getFileTree(Optional.of(this.path.getRealPath()), true))
.map(buf -> buf.length != 0)
.orElse(false);
}
@Override
public @Nullable CodeMPFolder getParent() {
public @Nullable CodeMPDirectory getParent() {
return this.path.getParent()
.map(parent -> new CodeMPFolder(this.fileSystem, parent))
.map(parent -> new CodeMPDirectory(this.fileSystem, parent))
.orElse(null);
}

View file

@ -0,0 +1,32 @@
package mp.code.intellij.vfs;
import com.intellij.platform.workspace.jps.entities.ModuleEntity;
import com.intellij.platform.workspace.storage.EntityStorage;
import com.intellij.workspaceModel.core.fileIndex.WorkspaceFileIndexContributor;
import com.intellij.workspaceModel.core.fileIndex.WorkspaceFileKind;
import com.intellij.workspaceModel.core.fileIndex.WorkspaceFileSetRegistrar;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("UnstableApiUsage")
public class CodeMPFileIndexContributor implements WorkspaceFileIndexContributor<ModuleEntity> {
@Override
public @NotNull Class<ModuleEntity> getEntityClass() {
return ModuleEntity.class;
}
@Override
public void registerFileSets(
@NotNull ModuleEntity moduleEntity,
@NotNull WorkspaceFileSetRegistrar workspaceFileSetRegistrar,
@NotNull EntityStorage entityStorage
) {
moduleEntity.getContentRoots().forEach(contentRootEntity -> {
workspaceFileSetRegistrar.registerFileSet(
contentRootEntity.getUrl(),
WorkspaceFileKind.CONTENT,
moduleEntity,
null
);
});
}
}

View file

@ -33,8 +33,8 @@ import java.util.function.BiConsumer;
* - Already open remote module will crash if not for that janky try-catch in {@link #findFileByPath(String)}, maybe
* try to connect quietly?
*/
@Getter
public class CodeMPFileSystem extends VirtualFileSystem {
@Getter // implements NonPhysicalFileSystem?
public class CodeMPFileSystem extends VirtualFileSystem { // implements NonPhysicalFileSystem {
public static String PROTOCOL = "codemp";
private final Set<VirtualFileListener> listeners;
@ -51,31 +51,30 @@ public class CodeMPFileSystem extends VirtualFileSystem {
public @Nullable CodeMPFile findFileByPath(@NotNull @NonNls String path) {
CodeMPPath cmpPath = new CodeMPPath(path);
try {
return CodeMP.getClient("file seek")
.getWorkspace(cmpPath.getWorkspaceName())
.filter(ws -> ws.getFileTree(Optional.of(cmpPath.getRealPath())).length != 0)
.map(ws -> new CodeMPFile(this, cmpPath))
.orElseGet(() -> new CodeMPFolder(this, cmpPath));
return this.fileOrFolderByPath(cmpPath);
} catch(NotConnectedException ex) {
CodeMPSettings.State state = Objects.requireNonNull(CodeMPSettings.getInstance().getState());
Credentials credentials = Objects.requireNonNull(state.getCredentials());
try {
CodeMPSettings.State state = Objects.requireNonNull(CodeMPSettings.getInstance().getState());
Credentials credentials = Objects.requireNonNull(state.getCredentials());
CodeMP.connect(
Objects.requireNonNull(state.getServerUrl()),
Objects.requireNonNull(credentials.getUserName()),
Objects.requireNonNull(credentials.getPasswordAsString())
);
return CodeMP.getClient("file seek")
.getWorkspace(cmpPath.getWorkspaceName())
.filter(ws -> ws.getFileTree(Optional.of(cmpPath.getRealPath())).length != 0)
.map(ws -> new CodeMPFile(this, cmpPath))
.orElseGet(() -> new CodeMPFolder(this, cmpPath));
} catch(ConnectionException e) {
return this.fileOrFolderByPath(cmpPath);
} catch(ConnectionException | NullPointerException e) {
return null;
} // TODO this sucks
}
}
private CodeMPFile fileOrFolderByPath(CodeMPPath cmpPath) {
return CodeMP.getClient("file seek")
.getWorkspace(cmpPath.getWorkspaceName())
.filter(ws -> ws.getFileTree(Optional.ofNullable(cmpPath.getRealPath()), true).length != 0).map(ws -> new CodeMPFile(this, cmpPath))
.orElseGet(() -> new CodeMPDirectory(this, cmpPath));
}
@Override
public void refresh(boolean asynchronous) {
// TODO find out if and where ij stores filetree
@ -127,7 +126,7 @@ public class CodeMPFileSystem extends VirtualFileSystem {
@Override
protected @NotNull CodeMPFile createChildFile(Object requester, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException {
if(vDir instanceof CodeMPFolder parent) {
if(vDir instanceof CodeMPDirectory parent) {
try {
Optional<Workspace> ws = CodeMP.getClient("delete file").getWorkspace(parent.path.getWorkspaceName());
if(ws.isPresent()) {
@ -147,13 +146,13 @@ public class CodeMPFileSystem extends VirtualFileSystem {
}
@Override
protected @NotNull CodeMPFolder createChildDirectory(
protected @NotNull CodeMPDirectory createChildDirectory(
Object requester,
@NotNull VirtualFile vDir,
@NotNull String dirName
) throws IOException {
if(vDir instanceof CodeMPFolder parent) {
return new CodeMPFolder(
if(vDir instanceof CodeMPDirectory parent) {
return new CodeMPDirectory(
this,
parent.path.resolve(dirName)
);
@ -207,4 +206,6 @@ public class CodeMPFileSystem extends VirtualFileSystem {
public @Nullable Path getNioPath(@NotNull VirtualFile file) {
return file.toNioPath();
}
}

View file

@ -1,5 +1,6 @@
package mp.code.intellij.vfs;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;
@ -16,6 +17,7 @@ import java.util.Optional;
* This helper class manages just that.
*/
@Getter @Setter
@EqualsAndHashCode
public class CodeMPPath {
/**
* The name of the workspace that contains this path.

View file

@ -23,6 +23,7 @@
<virtualFileSystem
id="codemp_vfs"
key="codemp"
physical="false"
implementationClass="mp.code.intellij.vfs.CodeMPFileSystem"/>
<notificationGroup id="CodeMP" displayType="BALLOON"/>
<applicationService serviceImplementation="mp.code.intellij.settings.CodeMPSettings"/>
@ -31,5 +32,6 @@
instance="mp.code.intellij.settings.CodeMPSettingsConfigurable"
id="mp.code.intellij.settings.CodeMPSettingsConfigurable"
displayName="CodeMP"/>
<workspaceModel.fileIndexContributor implementation="mp.code.intellij.vfs.CodeMPFileIndexContributor" />
</extensions>
</idea-plugin>

View file

@ -1,12 +1,62 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M32.0845 7.94025V4H24.0203V7.9896H16.029V4H7.91553V7.94025H4V36H16.0044V32.0045C16.0058 30.9457 16.4274 29.9308 17.1766 29.1826C17.9258 28.4345 18.9412 28.0143 20 28.0143C21.0588 28.0143 22.0743 28.4345 22.8234 29.1826C23.5726 29.9308 23.9942 30.9457 23.9956 32.0045V36H36V7.94025H32.0845Z"
fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="2.94192" y1="4.89955" x2="37.7772" y2="39.7345"
gradientUnits="userSpaceOnUse">
<stop offset="0.15937" stop-color="#3BEA62"/>
<stop offset="0.5404" stop-color="#3C99CC"/>
<stop offset="0.93739" stop-color="#6B57FF"/>
</linearGradient>
</defs>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100mm"
height="100mm"
viewBox="0 0 100 100"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
inkscape:zoom="1.3166807"
inkscape:cx="94.935697"
inkscape:cy="141.64406"
inkscape:window-width="1870"
inkscape:window-height="1006"
inkscape:window-x="25"
inkscape:window-y="45"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="matrix(0.98311673,0,0,0.98311673,-37.145524,-20.419013)"
style="stroke-width:0.50858661;stroke-dasharray:none;stroke:#000000;stroke-opacity:1;fill:#010101;fill-opacity:1">
<path
style="font-weight:bold;font-size:90.3111px;line-height:1.25;font-family:'Monoid HalfTight';-inkscape-font-specification:'Monoid HalfTight';fill:#010101;stroke:#000000;stroke-width:0.50858661;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="m 80.686333,71.922312 q 5.115277,1.940277 7.231943,5.409258 2.116667,3.468981 2.116667,9.995369 V 102.2024 q 0,2.82222 1.881481,3.99815 1.881481,1.11713 5.644443,1.11713 v 14.11111 q -10.524535,0 -16.580553,-4.70371 -5.997221,-4.7037 -5.997221,-14.52268 V 87.326939 q 0,-4.762499 -3.821758,-6.702777 -3.762963,-1.940277 -11.230091,-1.940277 V 64.572776 q 7.467128,0 11.230091,-1.940277 3.821758,-1.940278 3.821758,-6.702777 v -14.87546 q 0,-9.81898 5.997221,-14.522683 6.056018,-4.703703 16.580553,-4.703703 v 14.111109 q -3.762962,0 -5.644443,1.175925 -1.881481,1.11713 -1.881481,3.939352 v 14.87546 q 0,6.526388 -2.116667,9.995369 -2.116666,3.468981 -7.231943,5.409258 z"
id="text6"
inkscape:label="{"
aria-label="{" />
<path
style="font-weight:bold;font-size:33.8667px;line-height:1.25;font-family:'Monoid HalfTight';-inkscape-font-specification:'Monoid HalfTight';fill:#010101;stroke:#000000;stroke-width:0.50858661;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="m 103.39005,77.574239 v 8.995842 h 1.36701 q 1.89618,0 2.75608,-0.176389 1.49931,-0.308681 2.38125,-1.477258 0.904,-1.168578 0.904,-2.844274 0,-1.675696 -0.904,-2.844273 -0.88194,-1.168578 -2.38125,-1.477259 -0.8599,-0.176389 -2.75608,-0.176389 z m -5.644455,-5.291672 h 6.967365 q 3.2632,0 4.65226,0.33073 3.13091,0.749653 5.09324,3.285246 1.98438,2.513544 1.98438,6.173617 0,3.660073 -1.98438,6.195666 -1.96233,2.513544 -5.09324,3.263197 -1.38906,0.33073 -4.65226,0.33073 h -1.32291 v 11.465287 h -5.644455 z"
id="text4"
inkscape:label="P"
aria-label="P" />
<path
style="font-weight:bold;font-size:33.8667px;line-height:1.25;font-family:'Monoid HalfTight';-inkscape-font-specification:'Monoid HalfTight';fill:#010101;stroke:#000000;stroke-width:0.50858661;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="M 103.24182,69.128189 H 97.597369 V 38.083715 h 5.644451 l 4.12309,9.657301 h 0.24254 l 4.10104,-9.657301 h 5.64445 v 31.044474 h -5.64445 V 49.372615 h -0.22048 l -2.80018,5.644449 h -2.42535 l -2.80017,-5.732644 h -0.22049 z"
id="text5"
inkscape:label="M"
aria-label="M" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 818 B

After

Width:  |  Height:  |  Size: 3.8 KiB