Skip to content

Commit 80ca1c7

Browse files
committed
Feat: Tabularize is back!
1 parent 2e6e0f4 commit 80ca1c7

File tree

193 files changed

+2653
-190
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

193 files changed

+2653
-190
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package net.seesharpsoft.intellij.formatting;
2+
3+
import com.intellij.formatting.Block;
4+
import com.intellij.formatting.FormattingDocumentModel;
5+
import com.intellij.formatting.FormattingModel;
6+
import com.intellij.formatting.Spacing;
7+
import com.intellij.lang.ASTNode;
8+
import com.intellij.openapi.editor.Document;
9+
import com.intellij.openapi.util.TextRange;
10+
import com.intellij.psi.PsiElement;
11+
import com.intellij.psi.formatter.FormattingDocumentModelImpl;
12+
import com.intellij.psi.formatter.common.AbstractBlock;
13+
import org.jetbrains.annotations.NotNull;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
import java.util.List;
17+
18+
final class DummyFormattingModel implements FormattingModel {
19+
private final Block myRootBlock;
20+
private final FormattingDocumentModel myDocumentModel;
21+
22+
DummyFormattingModel(@NotNull PsiElement element) {
23+
myRootBlock = new AbstractBlock(element.getNode(), null, null) {
24+
@Override
25+
protected List<Block> buildChildren() {
26+
return EMPTY;
27+
}
28+
29+
@Override
30+
public @Nullable Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
31+
return null;
32+
}
33+
34+
@Override
35+
public boolean isLeaf() {
36+
return true;
37+
}
38+
};
39+
40+
Document document = FormattingDocumentModelImpl.createOn(element.getContainingFile()).getDocument();
41+
myDocumentModel = new FormattingDocumentModel() {
42+
@Override
43+
public int getLineNumber(int offset) {
44+
return document.getLineNumber(offset);
45+
}
46+
47+
@Override
48+
public int getLineStartOffset(int line) {
49+
return document.getLineStartOffset(line);
50+
}
51+
52+
@Override
53+
public @NotNull CharSequence getText(TextRange textRange) {
54+
return document.getCharsSequence().subSequence(textRange.getStartOffset(), textRange.getEndOffset());
55+
}
56+
57+
@Override
58+
public int getTextLength() {
59+
return document.getTextLength();
60+
}
61+
62+
@Override
63+
public @NotNull Document getDocument() {
64+
return document;
65+
}
66+
67+
@Override
68+
public boolean containsWhiteSpaceSymbolsOnly(int startOffset, int endOffset) {
69+
return false;
70+
}
71+
72+
@Override
73+
public @NotNull CharSequence adjustWhiteSpaceIfNecessary(@NotNull CharSequence whiteSpaceText,
74+
int startOffset,
75+
int endOffset,
76+
ASTNode nodeAfter, boolean changedViaPsi) {
77+
return whiteSpaceText;
78+
}
79+
};
80+
}
81+
82+
@Override
83+
public @NotNull Block getRootBlock() {
84+
return myRootBlock;
85+
}
86+
87+
@Override
88+
public @NotNull FormattingDocumentModel getDocumentModel() {
89+
return myDocumentModel;
90+
}
91+
92+
@Override
93+
public TextRange replaceWhiteSpace(TextRange textRange, String whiteSpace) {
94+
return textRange;
95+
}
96+
97+
@Override
98+
public TextRange shiftIndentInsideRange(ASTNode node, TextRange range, int indent) {
99+
return range;
100+
}
101+
102+
@Override
103+
public void commitChanges() {
104+
}
105+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.seesharpsoft.intellij.formatting;
2+
3+
import com.intellij.formatting.*;
4+
import com.intellij.psi.codeStyle.ExternalFormatProcessor;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
8+
public final class ExternalFormattingModelBuilderImpl implements FormattingModelBuilder {
9+
private final @Nullable FormattingModelBuilder myDefaultBuilder;
10+
11+
public ExternalFormattingModelBuilderImpl(@Nullable FormattingModelBuilder defaultBuilder) {
12+
myDefaultBuilder = defaultBuilder;
13+
}
14+
15+
@Override
16+
public @NotNull FormattingModel createModel(@NotNull FormattingContext formattingContext) {
17+
if (formattingContext.getFormattingMode() == FormattingMode.REFORMAT &&
18+
ExternalFormatProcessor.useExternalFormatter(formattingContext.getContainingFile()) || myDefaultBuilder == null) {
19+
return new DummyFormattingModel(formattingContext.getPsiElement());
20+
}
21+
return myDefaultBuilder.createModel(formattingContext);
22+
}
23+
24+
}

src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,9 @@ public static int getFieldEndOffset(PsiElement field) {
194194
public static VirtualFile getVirtualFile(PsiFile psiFile) {
195195
if (psiFile == null) return null;
196196
PsiFile original = psiFile.getOriginalFile();
197-
if (original != null && original != psiFile) return getVirtualFile(psiFile.getOriginalFile());
197+
if (original != psiFile) return getVirtualFile(psiFile.getOriginalFile());
198198
if (psiFile.getVirtualFile() != null) return psiFile.getVirtualFile();
199-
if (psiFile.getViewProvider() != null) return psiFile.getViewProvider().getVirtualFile();
200-
return null;
199+
return psiFile.getViewProvider().getVirtualFile();
201200
}
202201

203202
public static Project getProject(PsiFile psiFile) {
@@ -240,8 +239,11 @@ public static boolean hasEscapeCharacterAttribute(@NotNull PsiFile psiFile) {
240239
return CsvFileAttributes.getInstance(getProject(psiFile)).hasEscapeCharacterAttribute(getProject(psiFile), getVirtualFile(psiFile));
241240
}
242241

243-
public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(CsvFile csvFile) {
244-
CsvEscapeCharacter escapeCharacter = getEscapeCharacter(csvFile);
242+
public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(PsiFile csvFile) {
243+
return createColumnInfoMap(csvFile, CsvHelper::getMaxTextLineLength);
244+
}
245+
246+
public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(PsiFile csvFile, Function<CsvField, Integer> fnMaxTextLength) {
245247
Map<Integer, CsvColumnInfo<PsiElement>> columnInfoMap = new HashMap<>();
246248
int row = 0;
247249
boolean hasComments = false;
@@ -256,9 +258,9 @@ public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(CsvFile csvFile)
256258
CsvRecord record = (CsvRecord) child;
257259
int column = 0;
258260
for (CsvField field : record.getFieldList()) {
259-
Integer length = CsvHelper.getMaxTextLineLength(unquoteCsvValue(field.getText(), escapeCharacter));
261+
int length = fnMaxTextLength.apply(field);
260262
if (!columnInfoMap.containsKey(column)) {
261-
columnInfoMap.put(column, new CsvColumnInfo(column, length, row));
263+
columnInfoMap.put(column, new CsvColumnInfo<>(column, length, row));
262264
} else if (columnInfoMap.get(column).getMaxLength() < length) {
263265
columnInfoMap.get(column).setMaxLength(length, row);
264266
}
@@ -267,7 +269,7 @@ public static CsvColumnInfoMap<PsiElement> createColumnInfoMap(CsvFile csvFile)
267269
}
268270
++row;
269271
}
270-
return new CsvColumnInfoMap(columnInfoMap, PsiTreeUtil.hasErrorElements(csvFile), hasComments);
272+
return new CsvColumnInfoMap<>(columnInfoMap, PsiTreeUtil.hasErrorElements(csvFile), hasComments);
271273
}
272274

273275
public static String getFieldValue(PsiElement field, CsvEscapeCharacter escapeCharacter) {
@@ -285,6 +287,10 @@ public static String getFieldValue(PsiElement field, CsvEscapeCharacter escapeCh
285287
.orElse("");
286288
}
287289

290+
public static String unquoteCsvValue(String content) {
291+
return unquoteCsvValue(content, null);
292+
}
293+
288294
public static String unquoteCsvValue(String content, CsvEscapeCharacter escapeCharacter) {
289295
if (content == null) {
290296
return "";
@@ -293,7 +299,9 @@ public static String unquoteCsvValue(String content, CsvEscapeCharacter escapeCh
293299
String trimmedContent = content.trim();
294300
if (trimmedContent.length() > 1 && trimmedContent.startsWith("\"") && trimmedContent.endsWith("\"")) {
295301
result = trimmedContent.substring(1, trimmedContent.length() - 1);
296-
result = result.replaceAll("(?:" + escapeCharacter.getRegexPattern() + ")\"", "\"");
302+
if (escapeCharacter != null) {
303+
result = result.replaceAll("(?:" + escapeCharacter.getRegexPattern() + ")\"", "\"");
304+
}
297305
}
298306
return result;
299307
}
@@ -336,8 +344,8 @@ public static int getMaxTextLineLength(String text, @NotNull Function<String, In
336344
return maxLength;
337345
}
338346

339-
public static int getMaxTextLineLength(String text) {
340-
return getMaxTextLineLength(text, input -> input == null ? 0 : input.length());
347+
public static int getMaxTextLineLength(CsvField field) {
348+
return getMaxTextLineLength(field.getText().strip(), input -> input == null ? 0 : input.length());
341349
}
342350

343351
// source: https://www.baeldung.com/java-string-formatting-named-placeholders

src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import net.seesharpsoft.commons.collection.Pair;
1717
import net.seesharpsoft.intellij.plugins.csv.*;
1818
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
19-
import org.apache.commons.lang.StringUtils;
19+
import net.seesharpsoft.intellij.util.StringUtils;
2020
import org.jetbrains.annotations.NotNull;
2121
import org.jetbrains.annotations.Nullable;
2222

src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvFileEditorProvider.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package net.seesharpsoft.intellij.plugins.csv.editor;
22

3-
import com.intellij.diff.editor.DiffVirtualFile;
3+
import com.intellij.diff.editor.DiffViewerVirtualFile;
44
import com.intellij.openapi.editor.EditorSettings;
55
import com.intellij.openapi.fileEditor.*;
66
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
@@ -21,16 +21,16 @@ public static boolean acceptCsvFile(@NotNull Project project, @NotNull VirtualFi
2121
return CsvHelper.isCsvFile(project, file)
2222
&& !SingleRootFileViewProvider.isTooLargeForContentLoading(file)
2323
&& !SingleRootFileViewProvider.isTooLargeForIntelligence(file)
24-
&& !(file instanceof DiffVirtualFile);
24+
&& !(file instanceof DiffViewerVirtualFile);
2525
}
2626

2727
@Override
28-
public String getEditorTypeId() {
28+
public @NotNull String getEditorTypeId() {
2929
return EDITOR_TYPE_ID;
3030
}
3131

3232
@Override
33-
public FileEditorPolicy getPolicy() {
33+
public @NotNull FileEditorPolicy getPolicy() {
3434
switch (CsvEditorSettings.getInstance().getEditorPrio()) {
3535
case TEXT_FIRST:
3636
case TEXT_ONLY:
@@ -62,7 +62,7 @@ public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile vi
6262
}
6363

6464
@Override
65-
public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
65+
public @NotNull FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) {
6666
return TextEditorProvider.getInstance().readState(sourceElement, project, file);
6767
}
6868

@@ -81,7 +81,7 @@ public void disposeEditor(@NotNull FileEditor editor) {
8181
public Builder createEditorAsync(@NotNull Project project, @NotNull VirtualFile virtualFile) {
8282
return new Builder() {
8383
@Override
84-
public FileEditor build() {
84+
public @NotNull FileEditor build() {
8585
TextEditorProvider provider = TextEditorProvider.getInstance();
8686
TextEditor textEditor = (TextEditor) provider.createEditor(project, virtualFile);
8787
applySettings(textEditor.getEditor().getSettings(), CsvEditorSettings.getInstance());

0 commit comments

Comments
 (0)