diff --git a/src/org/rascalmpl/library/util/IDEServicesLibrary.java b/src/org/rascalmpl/library/util/IDEServicesLibrary.java index 3593a7caa9..47ee47b752 100644 --- a/src/org/rascalmpl/library/util/IDEServicesLibrary.java +++ b/src/org/rascalmpl/library/util/IDEServicesLibrary.java @@ -16,8 +16,10 @@ import org.rascalmpl.exceptions.RuntimeExceptionFactory; import org.rascalmpl.ideservices.IDEServices; +import org.rascalmpl.library.Prelude; import org.rascalmpl.repl.http.REPLContentServer; import org.rascalmpl.repl.http.REPLContentServerManager; +import org.rascalmpl.uri.URIResolverRegistry; import org.rascalmpl.uri.URIUtil; import org.rascalmpl.values.IRascalValueFactory; import org.rascalmpl.values.functions.IFunction; @@ -56,8 +58,62 @@ public void registerLanguage(IConstructor language) { public void applyDocumentsEdits(IList edits) { applyFileSystemEdits(edits); } + public void applyFileSystemEdits(IList edits) { - services.applyFileSystemEdits(edits); + var registry = URIResolverRegistry.getInstance(); + var vf = IRascalValueFactory.getInstance(); + edits.stream().map(IConstructor.class::cast).forEach(c -> { + try { + switch (c.getName()) { + case "removed": { + var file = (ISourceLocation) c.get("file"); + registry.remove(file.top(), false); + break; + } + case "created": { + var file = (ISourceLocation) c.get("file"); + if (registry.exists(file)) { + registry.setLastModified(file, System.currentTimeMillis()); + } else { + try (var out = registry.getCharacterWriter(file.top(), registry.detectCharset(file).name(), false)) { + out.write(""); + } + } + break; + } + case "renamed": { + var from = (ISourceLocation) c.get("from"); + var to = (ISourceLocation) c.get("to"); + registry.rename(from.top(), to.top(), true); + break; + } + case "changed": { + var file = (ISourceLocation) c.get("file"); + if (c.has("edits")) { + var textEdits = (IList) c.get("edits"); + var charset = registry.detectCharset(file).name(); + var contents = Prelude.readFile(vf, false, ((ISourceLocation) c.get("file")).top(), charset, false); + for (var e : textEdits.reverse()) { + var edit = (IConstructor) e; + var range = (ISourceLocation) edit.get("range"); + var prefix = contents.substring(0, range.getOffset()); + var replacement = (IString) edit.get("replacement"); + var postfix = contents.substring(range.getOffset() + range.getLength()); + contents = prefix.concat(replacement).concat(postfix); + }; + try (var writer = registry.getCharacterWriter(file.top(), charset, false)) { + contents.write(writer); + } + } else { + registry.setLastModified(file, System.currentTimeMillis()); + } + break; + } + } + } catch (IOException e) { + services.warning("Could not execute FileSystemChange due to " + e.getMessage(), URIUtil.rootLocation("unknown")); + } + }); } public void showInteractiveContent(IConstructor provider, IString title, IInteger viewColumn) { @@ -94,7 +150,6 @@ public void logMessage(IConstructor message) { services.logMessage(message); } - public void registerDiagnostics(IList messages) { services.registerDiagnostics(messages); }