44import com .intellij .codeInsight .lookup .LookupElement ;
55import com .intellij .openapi .fileEditor .impl .LoadTextUtil ;
66import com .intellij .openapi .project .Project ;
7+ import com .intellij .psi .PsiElement ;
78import com .intellij .psi .PsiFile ;
89import com .intellij .psi .search .FilenameIndex ;
910import com .intellij .psi .search .GlobalSearchScope ;
1011import org .jetbrains .annotations .NotNull ;
1112
13+ import java .util .Arrays ;
1214import java .util .HashSet ;
15+ import java .util .Objects ;
1316import java .util .Set ;
1417import java .util .regex .Matcher ;
1518import java .util .regex .Pattern ;
@@ -19,7 +22,7 @@ public class TableUtil {
1922 public static final String EXT_TABLES_SQL_FILENAME = "ext_tables.sql" ;
2023
2124 public static Set <String > getAvailableTableNames (@ NotNull Project project ) {
22- PsiFile [] extSqlFiles = FilenameIndex . getFilesByName (project , EXT_TABLES_SQL_FILENAME , GlobalSearchScope . allScope ( project ) );
25+ PsiFile [] extSqlFiles = getExtTablesSqlFilesInProject (project );
2326
2427 Set <String > tableNames = new HashSet <>();
2528
@@ -50,6 +53,55 @@ public static Set<String> getAvailableTableNames(@NotNull Project project) {
5053 return tableNames ;
5154 }
5255
56+ public static PsiElement [] getTableDefinitionElements (@ NotNull String tableName , @ NotNull Project project ) {
57+
58+ PsiFile [] extTablesSqlFilesInProjectContainingTable = getExtTablesSqlFilesInProjectContainingTable (tableName , project );
59+
60+ return Arrays
61+ .stream (extTablesSqlFilesInProjectContainingTable )
62+ .map (file -> {
63+ CharSequence charSequence = LoadTextUtil .loadText (file .getVirtualFile ());
64+
65+ final Matcher matcher = Pattern
66+ .compile ("create\\ s+table\\ s+(if\\ s+not\\ s+exists\\ s+)?([a-zA-Z_0-9]+)" , Pattern .CASE_INSENSITIVE )
67+ .matcher (charSequence );
68+ try {
69+ while (matcher .find ()) {
70+ if (matcher .groupCount () < 2 ) {
71+ continue ;
72+ }
73+
74+ final String foundTable = matcher .group (2 );
75+ if (!foundTable .equals (tableName )) {
76+ continue ;
77+ }
78+
79+ return file .findElementAt (matcher .end () - 2 );
80+ }
81+ } catch (IllegalStateException e ) {
82+ // do nothing
83+ }
84+
85+ return null ;
86+ })
87+ .filter (Objects ::nonNull )
88+ .toArray (PsiElement []::new );
89+ }
90+
91+ private static PsiFile [] getExtTablesSqlFilesInProjectContainingTable (@ NotNull String tableName , @ NotNull Project project ) {
92+
93+ return Arrays
94+ .stream (getExtTablesSqlFilesInProject (project ))
95+ .filter (Objects ::nonNull )
96+ .filter (file -> LoadTextUtil .loadText (file .getVirtualFile ()).toString ().contains (tableName ))
97+ .toArray (PsiFile []::new );
98+ }
99+
100+ @ NotNull
101+ private static PsiFile [] getExtTablesSqlFilesInProject (@ NotNull Project project ) {
102+ return FilenameIndex .getFilesByName (project , EXT_TABLES_SQL_FILENAME , GlobalSearchScope .allScope (project ));
103+ }
104+
53105 public static void completeAvailableTableNames (@ NotNull Project project , @ NotNull CompletionResultSet completionResultSet ) {
54106 for (String name : TableUtil .getAvailableTableNames (project )) {
55107 completionResultSet .addElement (new LookupElement () {
0 commit comments