Skip to content

Commit 16cf9f3

Browse files
committed
UnsupportedOperationException when creating 'scratch file' in IntelliJ IDEA
Signed-off-by: Dmytro Nosan <[email protected]>
1 parent e0f7699 commit 16cf9f3

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

spring-javaformat-intellij-idea/spring-javaformat-intellij-idea-plugin/src/main/java/io/spring/format/formatter/intellij/formatting/SpringJavaFormatFormattingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public boolean canFormat(@NotNull PsiFile file) {
7878
public void formatDocument(@NotNull Document document, @NotNull List<TextRange> formattingRanges,
7979
@NotNull FormattingContext formattingContext, boolean canChangeWhiteSpaceOnly, boolean quickFormat) {
8080
VirtualFile file = formattingContext.getVirtualFile();
81-
Path path = (file != null) ? file.toNioPath() : null;
81+
Path path = (file != null) ? file.getFileSystem().getNioPath(file) : null;
8282
JavaFormatConfig config = JavaFormatConfig.findFrom(path);
8383
Formatter formatter = new Formatter(config);
8484
String source = document.getText();

spring-javaformat-intellij-idea/spring-javaformat-intellij-idea-plugin/src/test/java/io/spring/format/formatter/intellij/formatting/SpringJavaFormatFormattingServiceTests.java

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.spring.format.formatter.intellij.formatting;
1818

19+
import java.nio.file.Files;
20+
import java.nio.file.Path;
1921
import java.util.Collections;
2022

2123
import com.intellij.formatting.FormattingContext;
@@ -25,16 +27,21 @@
2527
import com.intellij.openapi.fileTypes.FileTypeManager;
2628
import com.intellij.openapi.fileTypes.PlainTextFileType;
2729
import com.intellij.openapi.project.Project;
30+
import com.intellij.openapi.vfs.VirtualFile;
31+
import com.intellij.openapi.vfs.local.CoreLocalFileSystem;
32+
import com.intellij.openapi.vfs.local.CoreLocalVirtualFile;
2833
import com.intellij.psi.PsiFile;
34+
import com.intellij.testFramework.LightVirtualFile;
2935
import org.junit.jupiter.api.Test;
36+
import org.junit.jupiter.api.io.TempDir;
3037

3138
import io.spring.format.formatter.intellij.state.State;
3239

3340
import static org.assertj.core.api.Assertions.assertThat;
3441
import static org.mockito.ArgumentMatchers.any;
3542
import static org.mockito.BDDMockito.given;
43+
import static org.mockito.BDDMockito.willAnswer;
3644
import static org.mockito.Mockito.mock;
37-
import static org.mockito.Mockito.verify;
3845

3946
/**
4047
* Tests for {@link SpringJavaFormatFormattingService}.
@@ -72,14 +79,49 @@ void canFormatWhenJavaFileAndActiveReturnsTrue() {
7279
assertThat(this.service.canFormat(file)).isTrue();
7380
}
7481

82+
@Test
83+
void formatDocumentAppliesFormatting(@TempDir Path projectDir) throws Exception {
84+
Files.writeString(projectDir.resolve(".springjavaformatconfig"), "indentation-style=spaces");
85+
Document document = mockDocument("public class Hello{"
86+
+ "\tpublic void hello() {"
87+
+ "\tString value =\t\"Hello World\";}}");
88+
FormattingContext formattingContext = mock(FormattingContext.class);
89+
VirtualFile virtualFile = new CoreLocalVirtualFile(new CoreLocalFileSystem(), projectDir.resolve("Hello.java"));
90+
given(formattingContext.getVirtualFile()).willReturn(virtualFile);
91+
this.service.formatDocument(document, Collections.emptyList(), formattingContext, false, false);
92+
assertThat(document.getText()).isEqualTo("public class Hello {\n\n"
93+
+ " public void hello() {\n"
94+
+ " String value = \"Hello World\";\n"
95+
+ " }\n\n"
96+
+ "}");
97+
}
98+
7599
@Test
76100
void formatDocumentAppliesFormatting() {
77-
Document document = mock(Document.class);
78-
String text = "public class Hello {}";
79-
given(document.getText()).willReturn(text);
101+
Document document = mockDocument("public class Hello{"
102+
+ "\tpublic void hello() {"
103+
+ "\tString value =\t\"Hello World\";}}");
80104
FormattingContext formattingContext = mock(FormattingContext.class);
105+
VirtualFile virtualFile = new LightVirtualFile("Hello.java", document.getText());
106+
given(formattingContext.getVirtualFile()).willReturn(virtualFile);
81107
this.service.formatDocument(document, Collections.emptyList(), formattingContext, false, false);
82-
verify(document).replaceString(20, 20, "\n\n");
108+
assertThat(document.getText()).isEqualTo("public class Hello {\n\n"
109+
+ "\tpublic void hello() {\n"
110+
+ "\t\tString value = \"Hello World\";\n"
111+
+ "\t}\n\n"
112+
+ "}");
113+
}
114+
115+
116+
private Document mockDocument(String text) {
117+
Document document = mock(Document.class);
118+
StringBuilder documentText = new StringBuilder(text);
119+
willAnswer((invocation) -> {
120+
documentText.replace(invocation.getArgument(0), invocation.getArgument(1), invocation.getArgument(2));
121+
return null;
122+
}).given(document).replaceString(any(Integer.class), any(Integer.class), any(CharSequence.class));
123+
given(document.getText()).willAnswer((invocation) -> documentText.toString());
124+
return document;
83125
}
84126

85127
private PsiFile mockFile(FileType fileType, State state) {

0 commit comments

Comments
 (0)