Skip to content

Commit 3e01af3

Browse files
authored
Merge pull request #75 from cedricziel/tca-goto-declaration
TCA GotoDeclaration handler for table names
2 parents f370aa2 + eb41ce7 commit 3e01af3

File tree

3 files changed

+88
-2
lines changed

3 files changed

+88
-2
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.cedricziel.idea.typo3.tca.codeInsight.navigation;
2+
3+
import com.cedricziel.idea.typo3.util.TCAUtil;
4+
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
5+
import com.intellij.openapi.actionSystem.DataContext;
6+
import com.intellij.openapi.editor.Editor;
7+
import com.intellij.psi.PsiElement;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
import static com.cedricziel.idea.typo3.util.TableUtil.getTableDefinitionElements;
11+
12+
public class TablenameGotoDeclarationHandler implements GotoDeclarationHandler {
13+
@Nullable
14+
@Override
15+
public PsiElement[] getGotoDeclarationTargets(@Nullable PsiElement sourceElement, int offset, Editor editor) {
16+
17+
if (sourceElement == null || !isTablenameTcaField(sourceElement)) {
18+
return new PsiElement[0];
19+
}
20+
21+
return getTableDefinitionElements(sourceElement.getText(), sourceElement.getProject());
22+
}
23+
24+
@Nullable
25+
@Override
26+
public String getActionText(DataContext context) {
27+
return null;
28+
}
29+
30+
private boolean isTablenameTcaField(PsiElement psiElement) {
31+
return TCAUtil.arrayIndexIsTCATableNameField(psiElement);
32+
}
33+
}

src/main/java/com/cedricziel/idea/typo3/util/TableUtil.java

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import com.intellij.codeInsight.lookup.LookupElement;
55
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
66
import com.intellij.openapi.project.Project;
7+
import com.intellij.psi.PsiElement;
78
import com.intellij.psi.PsiFile;
89
import com.intellij.psi.search.FilenameIndex;
910
import com.intellij.psi.search.GlobalSearchScope;
1011
import org.jetbrains.annotations.NotNull;
1112

13+
import java.util.Arrays;
1214
import java.util.HashSet;
15+
import java.util.Objects;
1316
import java.util.Set;
1417
import java.util.regex.Matcher;
1518
import 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() {

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,9 @@ It is a great inspiration for possible solutions and parts of the code.</p>
298298
<!-- inspections -->
299299
<inspectionToolProvider implementation="com.cedricziel.idea.typo3.codeInspection.TYPO3InspectionToolProvider"/>
300300

301-
<!-- got handlers -->
301+
<!-- goto handlers -->
302302
<gotoDeclarationHandler implementation="com.cedricziel.idea.typo3.codeInsight.navigation.PathResourceGotoDeclarationHandler"/>
303+
<gotoDeclarationHandler implementation="com.cedricziel.idea.typo3.tca.codeInsight.navigation.TablenameGotoDeclarationHandler"/>
303304
</extensions>
304305

305306
<extensions defaultExtensionNs="com.jetbrains.php">

0 commit comments

Comments
 (0)