1
1
package net .seesharpsoft .intellij .plugins .csv ;
2
2
3
+ import com .intellij .lang .*;
4
+ import com .intellij .lexer .Lexer ;
5
+ import com .intellij .openapi .project .Project ;
3
6
import com .intellij .psi .PsiElement ;
7
+ import com .intellij .psi .PsiManager ;
8
+ import com .intellij .psi .TokenType ;
9
+ import com .intellij .psi .impl .source .DummyHolder ;
10
+ import com .intellij .psi .impl .source .DummyHolderFactory ;
11
+ import com .intellij .psi .impl .source .tree .FileElement ;
12
+ import com .intellij .psi .tree .IElementType ;
4
13
import com .intellij .psi .util .PsiTreeUtil ;
5
14
import net .seesharpsoft .intellij .plugins .csv .psi .CsvField ;
6
15
import net .seesharpsoft .intellij .plugins .csv .psi .CsvFile ;
7
16
import net .seesharpsoft .intellij .plugins .csv .psi .CsvRecord ;
17
+ import net .seesharpsoft .intellij .plugins .csv .psi .CsvTypes ;
8
18
9
19
import java .util .HashMap ;
10
20
import java .util .Map ;
11
21
12
22
public class CsvHelper {
13
23
14
- public static Map <Integer , CsvColumnInfo <PsiElement >> createColumnInfoMap (CsvFile csvFile ) {
24
+ // replaces PsiElementFactory.SERVICE.getInstance(element.getProject()).createDummyHolder("<undefined>", CsvTypes.FIELD, null);
25
+ // https://github.com/SeeSharpSoft/intellij-csv-validator/issues/4
26
+ public static PsiElement createEmptyCsvField (Project project ) {
27
+ final String text = "<undefined>" ;
28
+ final IElementType type = CsvTypes .FIELD ;
29
+ final PsiManager psiManager = PsiManager .getInstance (project );
30
+ final DummyHolder dummyHolder = DummyHolderFactory .createHolder (psiManager , null );
31
+ final FileElement fileElement = dummyHolder .getTreeElement ();
32
+ final ParserDefinition parserDefinition = LanguageParserDefinitions .INSTANCE .forLanguage (CsvLanguage .INSTANCE );
33
+ final Lexer lexer = parserDefinition .createLexer (project );
34
+ final PsiBuilder psiBuilder = PsiBuilderFactory .getInstance ().createBuilder (project , fileElement , lexer , CsvLanguage .INSTANCE , text );
35
+ final ASTNode node = parserDefinition .createParser (project ).parse (type , psiBuilder );
36
+ fileElement .rawAddChildren ((com .intellij .psi .impl .source .tree .TreeElement )node );
37
+ return node .getPsi ();
38
+ }
39
+
40
+ public static IElementType getElementType (PsiElement element ) {
41
+ return element == null || element .getNode () == null ? null : element .getNode ().getElementType ();
42
+ }
43
+
44
+ public static PsiElement getParentFieldElement (PsiElement element ) {
45
+ IElementType elementType = CsvHelper .getElementType (element );
46
+
47
+ if (elementType == CsvTypes .COMMA || elementType == CsvTypes .CRLF ) {
48
+ element = element .getPrevSibling ();
49
+ elementType = CsvHelper .getElementType (element );
50
+ }
51
+
52
+ if (elementType == CsvTypes .RECORD ) {
53
+ element = element .getLastChild ();
54
+ elementType = CsvHelper .getElementType (element );
55
+ }
56
+
57
+ if (elementType == TokenType .WHITE_SPACE ) {
58
+ if (CsvHelper .getElementType (element .getParent ()) == CsvTypes .FIELD ) {
59
+ element = element .getParent ();
60
+ } else if (CsvHelper .getElementType (element .getPrevSibling ()) == CsvTypes .FIELD ) {
61
+ element = element .getPrevSibling ();
62
+ } else if (CsvHelper .getElementType (element .getNextSibling ()) == CsvTypes .FIELD ) {
63
+ element = element .getNextSibling ();
64
+ } else {
65
+ element = null ;
66
+ }
67
+ } else {
68
+ while (element != null && elementType != CsvTypes .FIELD ) {
69
+ element = element .getParent ();
70
+ elementType = CsvHelper .getElementType (element );
71
+ }
72
+ }
73
+ return element ;
74
+ }
75
+
76
+ public static CsvColumnInfoMap <PsiElement > createColumnInfoMap (CsvFile csvFile ) {
15
77
Map <Integer , CsvColumnInfo <PsiElement >> columnInfoMap = new HashMap <>();
16
78
CsvRecord [] records = PsiTreeUtil .getChildrenOfType (csvFile , CsvRecord .class );
17
79
int row = 0 ;
@@ -29,7 +91,6 @@ public static Map<Integer, CsvColumnInfo<PsiElement>> createColumnInfoMap(CsvFil
29
91
}
30
92
++row ;
31
93
}
32
- return columnInfoMap ;
94
+ return new CsvColumnInfoMap ( columnInfoMap ) ;
33
95
}
34
-
35
96
}
0 commit comments