Skip to content

Commit 702341d

Browse files
committed
Use focus instead of Tree+loc.
1 parent 3533e18 commit 702341d

7 files changed

Lines changed: 52 additions & 28 deletions

File tree

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ILanguageContributions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public interface ILanguageContributions {
6161
public InterruptibleFuture<ISet> implementation(IList focus);
6262
public InterruptibleFuture<IList> codeAction(IList focus);
6363
public InterruptibleFuture<IList> selectionRange(IList focus);
64-
public InterruptibleFuture<IList> formatting(ITree input, ISourceLocation loc, IConstructor formattingOptions);
64+
public InterruptibleFuture<IList> formatting(IList input, IConstructor formattingOptions);
6565

6666
public InterruptibleFuture<ISourceLocation> prepareRename(IList focus);
6767
public InterruptibleFuture<ITuple> rename(IList focus, String name);

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/InterpretedLanguageContributions.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,9 +396,9 @@ public InterruptibleFuture<IList> selectionRange(IList focus) {
396396
}
397397

398398
@Override
399-
public InterruptibleFuture<IList> formatting(ITree input, ISourceLocation loc, IConstructor formattingOptions) {
400-
debug(LanguageContributions.FORMATTING, input != null ? TreeAdapter.getLocation(input) : null, formattingOptions);
401-
return execFunction(LanguageContributions.FORMATTING, formatting, VF.list(), input, loc, formattingOptions);
399+
public InterruptibleFuture<IList> formatting(IList focus, IConstructor formattingOptions) {
400+
debug(LanguageContributions.FORMATTING, focus.size(), formattingOptions);
401+
return execFunction(LanguageContributions.FORMATTING, formatting, VF.list(), focus, formattingOptions);
402402
}
403403

404404
private void debug(String name, Object param) {

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/LanguageContributionsMultiplexer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,8 @@ public InterruptibleFuture<IList> selectionRange(IList focus) {
342342
}
343343

344344
@Override
345-
public InterruptibleFuture<IList> formatting(ITree input, ISourceLocation loc, IConstructor formattingOptions) {
346-
return flatten(formatting, c -> c.formatting(input, loc, formattingOptions));
345+
public InterruptibleFuture<IList> formatting(IList focus, IConstructor formattingOptions) {
346+
return flatten(formatting, c -> c.formatting(focus, formattingOptions));
347347
}
348348

349349
@Override

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
115115
import org.eclipse.lsp4j.services.LanguageClient;
116116
import org.eclipse.lsp4j.services.LanguageClientAware;
117+
import org.eclipse.lsp4j.util.Ranges;
117118
import org.rascalmpl.uri.URIResolverRegistry;
118119
import org.rascalmpl.values.IRascalValueFactory;
119120
import org.rascalmpl.values.parsetrees.ITree;
@@ -413,7 +414,7 @@ private CompletableFuture<ISourceLocation> computeRenameRange(final ILanguageCon
413414
public CompletableFuture<WorkspaceEdit> rename(RenameParams params) {
414415
logger.trace("rename for: {}, new name: {}", params.getTextDocument().getUri(), params.getNewName());
415416
final ILanguageContributions contribs = contributions(params.getTextDocument());
416-
final Position rascalPos = Locations.toRascalPosition(params.getTextDocument(), params.getPosition(), columns);;
417+
final Position rascalPos = Locations.toRascalPosition(params.getTextDocument(), params.getPosition(), columns);
417418
return getFile(params.getTextDocument())
418419
.getCurrentTreeAsync()
419420
.thenApply(Versioned::get)
@@ -736,34 +737,54 @@ public CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActio
736737
@Override
737738
public CompletableFuture<List<? extends TextEdit>> formatting(DocumentFormattingParams params) {
738739
logger.debug("Formatting: {}", params);
739-
return format(params.getTextDocument(), null, params.getOptions());
740+
741+
TextDocumentIdentifier uri = params.getTextDocument();
742+
final ILanguageContributions contribs = contributions(uri);
743+
744+
// call the `formatting` implementation of the relevant language contribution
745+
return getFile(uri)
746+
.getCurrentTreeAsync()
747+
.thenApply(Versioned::get)
748+
.thenCompose(tree -> {
749+
final var opts = getFormattingOptions(params.getOptions());
750+
return contribs.formatting(VF.list(tree), opts).get();
751+
})
752+
.thenApply(l -> DocumentChanges.translateTextEdits(this, l, Map.of()));
740753
}
741754

742755
@Override
743756
public CompletableFuture<List<? extends TextEdit>> rangeFormatting(DocumentRangeFormattingParams params) {
744757
logger.debug("Formatting range: {}", params);
745-
return format(params.getTextDocument(), params.getRange(), params.getOptions());
746-
}
747758

748-
private CompletableFuture<List<? extends TextEdit>> format(TextDocumentIdentifier uri, @Nullable Range range, FormattingOptions options) {
759+
TextDocumentIdentifier uri = params.getTextDocument();
760+
Range range = params.getRange();
749761
final ILanguageContributions contribs = contributions(uri);
750762

751-
// convert the `FormattingOptions` map to a `set[FormattingOption]`
752-
IConstructor optSet = getFormattingOptions(options);
753-
754763
// call the `formatting` implementation of the relevant language contribution
755-
return getFile(uri)
764+
var fileState = getFile(uri);
765+
return fileState
756766
.getCurrentTreeAsync()
757767
.thenApply(Versioned::get)
758768
.thenCompose(tree -> {
759-
// range to Rascal loc
760-
ISourceLocation loc = range == null
761-
? TreeAdapter.getLocation(tree)
762-
: null; // TODO map Range to ISourceLocation
763-
return contribs.formatting(tree, loc, optSet).get();
769+
// just a range
770+
var start = Locations.toRascalPosition(uri, range.getStart(), columns);
771+
var end = Locations.toRascalPosition(uri, range.getEnd(), columns);
772+
// compute the focus list at the end of the range
773+
var focus = TreeSearch.computeFocusList(tree, end.getLine(), end.getCharacter())
774+
.stream()
775+
.map(ITree.class::cast)
776+
// check for containment of the start of the range
777+
.filter(t -> Ranges.containsPosition(Locations.toRange(TreeAdapter.getLocation(t), columns), start))
778+
.collect(VF.listWriter());
779+
780+
var opts = getFormattingOptions(params.getOptions());
781+
return contribs.formatting(focus, opts).get();
764782
})
765783
// convert the document changes
766-
.thenApply(l -> DocumentChanges.translateTextEdits(this, l, Map.of()));
784+
.thenApply(l -> DocumentChanges.translateTextEdits(this, l, Map.of())
785+
.stream()
786+
.filter(e -> Ranges.containsRange(range, e.getRange()))
787+
.collect(Collectors.toList()));
767788
}
768789

769790
private IConstructor getFormattingOptions(FormattingOptions options) {

rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParserOnlyContribution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public InterruptibleFuture<IList> codeAction(IList focus) {
188188
}
189189

190190
@Override
191-
public InterruptibleFuture<IList> formatting(ITree input, ISourceLocation loc, IConstructor formattingOptions) {
191+
public InterruptibleFuture<IList> formatting(IList focus, IConstructor formattingOptions) {
192192
return InterruptibleFuture.completedFuture(VF.list());
193193
}
194194

rascal-lsp/src/main/rascal/library/demo/lang/pico/LanguageServer.rsc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ set[LanguageService] picoLanguageServer(bool allowRecovery) = {
7575
formatting(picoFormattingService)
7676
};
7777

78-
list[TextEdit] picoFormattingService(Tree input, loc range, FormattingOptions opts) {
79-
str original = "<input>";
80-
box = toBox(input);
78+
list[TextEdit] picoFormattingService(Focus input, FormattingOptions opts) {
79+
str original = "<input[-1]>";
80+
box = toBox(input[-1]);
8181
box = visit (box) { case i:I(_) => i[is=opts.tabSize] }
8282
formatted = format(box);
8383

@@ -102,10 +102,13 @@ list[TextEdit] picoFormattingService(Tree input, loc range, FormattingOptions op
102102
}
103103

104104
// compute layout differences as edits, and restore comments
105-
edits = layoutDiff(input, parse(#start[Program], formatted, input@\loc.top));
105+
edits = layoutDiff(input[-1], parse(#start[Program], formatted, input[-1]@\loc.top));
106106

107107
// instead of computing all edits and filtering, we can be more efficient by only formatting certain trees.
108-
return [e | e <- edits, isContainedIn(e.range, range)];
108+
loc range = input[0]@\loc;
109+
filteredEdits = [e | e <- edits, isContainedIn(e.range, range)];
110+
111+
return filteredEdits;
109112
}
110113

111114
set[LanguageService] picoLanguageServer() = picoLanguageServer(false);

rascal-lsp/src/main/rascal/library/util/LanguageServer.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ data LanguageService
278278
, loc (Focus _focus) prepareRenameService = defaultPrepareRenameService)
279279
| didRenameFiles(tuple[list[DocumentEdit], set[Message]] (list[DocumentEdit] fileRenames) didRenameFilesService)
280280
| selectionRange(list[loc](Focus _focus) selectionRangeService)
281-
| formatting (list[TextEdit](Tree _input, loc range, FormattingOptions _opts) formattingService)
281+
| formatting (list[TextEdit](Focus _focus, FormattingOptions _opts) formattingService)
282282
;
283283

284284
loc defaultPrepareRenameService(Focus _:[Tree tr, *_]) = tr.src when tr.src?;

0 commit comments

Comments
 (0)