Skip to content
58 changes: 56 additions & 2 deletions src/org/rascalmpl/library/util/IDEServicesLibrary.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -56,8 +58,61 @@ 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 {
var out = registry.getCharacterWriter(file.top(), "UTF-8", false);
out.write("");
out.close();
}
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 contents = Prelude.readFile(vf, false, ((ISourceLocation) (c.get("file"))).top(), "UTF-8", false).getValue();
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")).getValue();
var postfix = contents.substring(range.getOffset() + range.getLength());
contents = prefix + replacement + postfix;
};
var writer = registry.getCharacterWriter(file.top(), "UTF-8", false);
writer.write(contents);
writer.close();
} 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) {
Expand Down Expand Up @@ -94,7 +149,6 @@ public void logMessage(IConstructor message) {
services.logMessage(message);
}


public void registerDiagnostics(IList messages) {
services.registerDiagnostics(messages);
}
Expand Down