Skip to content

Commit 21e7968

Browse files
committed
move Drupal bridge plugin inside
1 parent 588eb52 commit 21e7968

File tree

59 files changed

+3720
-0
lines changed

Some content is hidden

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

59 files changed

+3720
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package de.espend.idea.php.drupal;
2+
3+
import com.intellij.openapi.util.IconLoader;
4+
5+
import javax.swing.*;
6+
7+
/**
8+
* @author Daniel Espendiller <[email protected]>
9+
*/
10+
public class DrupalIcons {
11+
public static final Icon DRUPAL = IconLoader.getIcon("icons/drupal.png");
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package de.espend.idea.php.drupal;
2+
3+
4+
import com.intellij.openapi.project.Project;
5+
import com.intellij.psi.PsiElement;
6+
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
/**
10+
* @author Daniel Espendiller <[email protected]>
11+
*/
12+
public class DrupalProjectComponent {
13+
14+
public static boolean isEnabled(Project project) {
15+
return Symfony2ProjectComponent.isEnabled(project);
16+
}
17+
18+
public static boolean isEnabled(@Nullable PsiElement psiElement) {
19+
return psiElement != null && isEnabled(psiElement.getProject());
20+
}
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package de.espend.idea.php.drupal.annotation;
2+
3+
import com.intellij.psi.PsiElement;
4+
import com.intellij.psi.PsiReference;
5+
import com.jetbrains.php.lang.PhpLangUtil;
6+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
7+
import de.espend.idea.php.annotation.extension.PhpAnnotationCompletionProvider;
8+
import de.espend.idea.php.annotation.extension.PhpAnnotationReferenceProvider;
9+
import de.espend.idea.php.annotation.extension.parameter.AnnotationCompletionProviderParameter;
10+
import de.espend.idea.php.annotation.extension.parameter.AnnotationPropertyParameter;
11+
import de.espend.idea.php.annotation.extension.parameter.PhpAnnotationReferenceProviderParameter;
12+
import de.espend.idea.php.drupal.index.PermissionIndex;
13+
import de.espend.idea.php.drupal.utils.IndexUtil;
14+
import org.apache.commons.lang.StringUtils;
15+
import org.jetbrains.annotations.NotNull;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
/**
19+
* @author Daniel Espendiller <[email protected]>
20+
*
21+
* "@ContentEntityTypeAnnotation"
22+
*/
23+
public class ConfigEntityTypeAnnotation implements PhpAnnotationCompletionProvider, PhpAnnotationReferenceProvider {
24+
@Override
25+
public void getPropertyValueCompletions(AnnotationPropertyParameter parameter, AnnotationCompletionProviderParameter completionProviderParameter) {
26+
if(!isSupported(parameter)) {
27+
return;
28+
}
29+
30+
if("admin_permission".equalsIgnoreCase(parameter.getPropertyName())) {
31+
completionProviderParameter.getResult().addAllElements(IndexUtil.getIndexedKeyLookup(parameter.getProject(), PermissionIndex.KEY));
32+
}
33+
}
34+
35+
private boolean isSupported(@NotNull AnnotationPropertyParameter parameter) {
36+
return parameter.getType() != AnnotationPropertyParameter.Type.DEFAULT &&
37+
PhpLangUtil.equalsClassNames(StringUtils.stripStart(parameter.getPhpClass().getFQN(), "\\"), "Drupal\\Core\\Entity\\Annotation\\ConfigEntityType");
38+
}
39+
40+
@Nullable
41+
@Override
42+
public PsiReference[] getPropertyReferences(AnnotationPropertyParameter parameter, PhpAnnotationReferenceProviderParameter phpAnnotationReferenceProviderParameter) {
43+
if(!isSupported(parameter)) {
44+
return new PsiReference[0];
45+
}
46+
47+
String propertyName = parameter.getPropertyName();
48+
49+
if("admin_permission".equalsIgnoreCase(propertyName)) {
50+
String contents = getContents(parameter.getElement());
51+
if(StringUtils.isBlank(contents)) {
52+
return new PsiReference[0];
53+
}
54+
55+
return new PsiReference[] {new ContentEntityTypeAnnotation.MyPermissionPsiPolyVariantReferenceBase(parameter.getElement(), contents)};
56+
}
57+
58+
return new PsiReference[0];
59+
}
60+
61+
@Nullable
62+
private String getContents(@NotNull PsiElement element) {
63+
if(!(element instanceof StringLiteralExpression)) {
64+
return null;
65+
}
66+
67+
String contents = ((StringLiteralExpression) element).getContents();
68+
if(StringUtils.isBlank(contents)) {
69+
return null;
70+
}
71+
72+
return contents;
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package de.espend.idea.php.drupal.annotation;
2+
3+
import com.intellij.psi.*;
4+
import com.jetbrains.php.lang.PhpLangUtil;
5+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
6+
import de.espend.idea.php.annotation.extension.PhpAnnotationCompletionProvider;
7+
import de.espend.idea.php.annotation.extension.PhpAnnotationReferenceProvider;
8+
import de.espend.idea.php.annotation.extension.parameter.AnnotationCompletionProviderParameter;
9+
import de.espend.idea.php.annotation.extension.parameter.AnnotationPropertyParameter;
10+
import de.espend.idea.php.annotation.extension.parameter.PhpAnnotationReferenceProviderParameter;
11+
import de.espend.idea.php.drupal.index.PermissionIndex;
12+
import de.espend.idea.php.drupal.registrar.YamlPermissionGotoCompletion;
13+
import de.espend.idea.php.drupal.utils.IndexUtil;
14+
import fr.adrienbrault.idea.symfony2plugin.routing.RouteHelper;
15+
import org.apache.commons.lang.StringUtils;
16+
import org.jetbrains.annotations.NotNull;
17+
import org.jetbrains.annotations.Nullable;
18+
19+
/**
20+
* @author Daniel Espendiller <[email protected]>
21+
*
22+
* "@ContentEntityTypeAnnotation"
23+
*/
24+
public class ContentEntityTypeAnnotation implements PhpAnnotationCompletionProvider, PhpAnnotationReferenceProvider {
25+
@Override
26+
public void getPropertyValueCompletions(AnnotationPropertyParameter parameter, AnnotationCompletionProviderParameter completionProviderParameter) {
27+
if(!isSupported(parameter)) {
28+
return;
29+
}
30+
31+
if("field_ui_base_route".equalsIgnoreCase(parameter.getPropertyName())) {
32+
completionProviderParameter.getResult().addAllElements(RouteHelper.getRoutesLookupElements(parameter.getProject()));
33+
}
34+
35+
if("admin_permission".equalsIgnoreCase(parameter.getPropertyName())) {
36+
completionProviderParameter.getResult().addAllElements(IndexUtil.getIndexedKeyLookup(parameter.getProject(), PermissionIndex.KEY));
37+
}
38+
}
39+
40+
private boolean isSupported(@NotNull AnnotationPropertyParameter parameter) {
41+
return parameter.getType() != AnnotationPropertyParameter.Type.DEFAULT &&
42+
PhpLangUtil.equalsClassNames(StringUtils.stripStart(parameter.getPhpClass().getFQN(), "\\"), "Drupal\\Core\\Entity\\Annotation\\ContentEntityType");
43+
}
44+
45+
@Nullable
46+
@Override
47+
public PsiReference[] getPropertyReferences(AnnotationPropertyParameter parameter, PhpAnnotationReferenceProviderParameter phpAnnotationReferenceProviderParameter) {
48+
if(!isSupported(parameter)) {
49+
return new PsiReference[0];
50+
}
51+
52+
String propertyName = parameter.getPropertyName();
53+
54+
if("field_ui_base_route".equalsIgnoreCase(propertyName)) {
55+
String contents = getContents(parameter.getElement());
56+
if(StringUtils.isBlank(contents)) {
57+
return new PsiReference[0];
58+
}
59+
60+
return new PsiReference[] {new MyRoutePsiPolyVariantReferenceBase(parameter.getElement(), contents)};
61+
} else if("admin_permission".equalsIgnoreCase(propertyName)) {
62+
String contents = getContents(parameter.getElement());
63+
if(StringUtils.isBlank(contents)) {
64+
return new PsiReference[0];
65+
}
66+
67+
return new PsiReference[] {new MyPermissionPsiPolyVariantReferenceBase(parameter.getElement(), contents)};
68+
}
69+
70+
return new PsiReference[0];
71+
}
72+
73+
@Nullable
74+
private String getContents(@NotNull PsiElement element) {
75+
if(!(element instanceof StringLiteralExpression)) {
76+
return null;
77+
}
78+
79+
String contents = ((StringLiteralExpression) element).getContents();
80+
if(StringUtils.isBlank(contents)) {
81+
return null;
82+
}
83+
84+
return contents;
85+
}
86+
87+
private static class MyRoutePsiPolyVariantReferenceBase extends PsiPolyVariantReferenceBase<PsiElement> {
88+
@NotNull
89+
private final PsiElement element;
90+
91+
@NotNull
92+
private final String contents;
93+
94+
MyRoutePsiPolyVariantReferenceBase(@NotNull PsiElement element, @NotNull String contents) {
95+
super(element);
96+
this.element = element;
97+
this.contents = contents;
98+
}
99+
100+
@NotNull
101+
@Override
102+
public Object[] getVariants() {
103+
return new Object[0];
104+
}
105+
106+
@NotNull
107+
@Override
108+
public ResolveResult[] multiResolve(boolean b) {
109+
PsiElement routeNameTarget = RouteHelper.getRouteNameTarget(element.getProject(), contents);
110+
if(routeNameTarget == null) {
111+
return new ResolveResult[0];
112+
}
113+
114+
return PsiElementResolveResult.createResults(routeNameTarget);
115+
}
116+
}
117+
118+
public static class MyPermissionPsiPolyVariantReferenceBase extends PsiPolyVariantReferenceBase<PsiElement> {
119+
@NotNull
120+
private final PsiElement element;
121+
122+
@NotNull
123+
private final String contents;
124+
125+
MyPermissionPsiPolyVariantReferenceBase(@NotNull PsiElement element, @NotNull String contents) {
126+
super(element);
127+
this.element = element;
128+
this.contents = contents;
129+
}
130+
131+
@NotNull
132+
@Override
133+
public Object[] getVariants() {
134+
return new Object[0];
135+
}
136+
137+
@NotNull
138+
@Override
139+
public ResolveResult[] multiResolve(boolean b) {
140+
return PsiElementResolveResult.createResults(YamlPermissionGotoCompletion.getPermissionPsiElements(element.getProject(), contents));
141+
}
142+
}
143+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package de.espend.idea.php.drupal.annotation;
2+
3+
import de.espend.idea.php.annotation.dict.AnnotationPropertyEnum;
4+
import de.espend.idea.php.annotation.extension.PhpAnnotationVirtualProperties;
5+
import de.espend.idea.php.annotation.extension.parameter.AnnotationCompletionProviderParameter;
6+
import de.espend.idea.php.annotation.extension.parameter.AnnotationVirtualPropertyCompletionParameter;
7+
import de.espend.idea.php.annotation.extension.parameter.AnnotationVirtualPropertyTargetsParameter;
8+
import org.apache.commons.lang.StringUtils;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.util.Collections;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
15+
/**
16+
* @author Daniel Espendiller <[email protected]>
17+
*/
18+
public class DrupalVirtualProperties implements PhpAnnotationVirtualProperties {
19+
final private static Map<String, Map<String, AnnotationPropertyEnum>> ITEMS = Collections.unmodifiableMap(new HashMap<String, Map<String, AnnotationPropertyEnum>>() {{
20+
put("Drupal\\Core\\Entity\\Annotation\\ContentEntityType", Collections.unmodifiableMap(new HashMap<String, AnnotationPropertyEnum>() {{
21+
put("id", AnnotationPropertyEnum.STRING);
22+
put("label", AnnotationPropertyEnum.STRING);
23+
put("handlers", AnnotationPropertyEnum.ARRAY);
24+
put("admin_permission", AnnotationPropertyEnum.STRING);
25+
put("base_table", AnnotationPropertyEnum.STRING);
26+
put("data_table", AnnotationPropertyEnum.STRING);
27+
put("label_callback", AnnotationPropertyEnum.STRING);
28+
put("translatable", AnnotationPropertyEnum.BOOLEAN);
29+
put("entity_keys", AnnotationPropertyEnum.ARRAY);
30+
put("links", AnnotationPropertyEnum.ARRAY);
31+
put("field_ui_base_route", AnnotationPropertyEnum.STRING);
32+
put("common_reference_target", AnnotationPropertyEnum.STRING);
33+
}}));
34+
35+
put("Drupal\\Core\\Entity\\Annotation\\ConfigEntityType", Collections.unmodifiableMap(new HashMap<String, AnnotationPropertyEnum>() {{
36+
put("id", AnnotationPropertyEnum.STRING);
37+
put("label", AnnotationPropertyEnum.STRING);
38+
put("handlers", AnnotationPropertyEnum.STRING);
39+
put("entity_keys", AnnotationPropertyEnum.ARRAY);
40+
put("admin_permission", AnnotationPropertyEnum.STRING);
41+
put("list_cache_tags", AnnotationPropertyEnum.ARRAY);
42+
put("config_export", AnnotationPropertyEnum.ARRAY);
43+
}}));
44+
45+
put("Drupal\\Component\\Annotation\\Plugin", Collections.unmodifiableMap(new HashMap<String, AnnotationPropertyEnum>() {{
46+
put("id", AnnotationPropertyEnum.STRING);
47+
put("title", AnnotationPropertyEnum.STRING);
48+
put("description", AnnotationPropertyEnum.STRING);
49+
}}));
50+
}});
51+
52+
@Override
53+
public void addCompletions(@NotNull AnnotationVirtualPropertyCompletionParameter virtualPropertyParameter, @NotNull AnnotationCompletionProviderParameter parameter) {
54+
String fqn = StringUtils.stripStart(virtualPropertyParameter.getPhpClass().getFQN(), "\\");
55+
if(!ITEMS.containsKey(fqn)) {
56+
return;
57+
}
58+
59+
for (Map.Entry<String, AnnotationPropertyEnum> item : ITEMS.get(fqn).entrySet()) {
60+
virtualPropertyParameter.addLookupElement(item.getKey(), item.getValue());
61+
}
62+
}
63+
64+
@Override
65+
public void getTargets(@NotNull AnnotationVirtualPropertyTargetsParameter parameter) {
66+
String fqn = StringUtils.stripStart(parameter.getPhpClass().getFQN(), "\\");
67+
if(!ITEMS.containsKey(fqn)) {
68+
return;
69+
}
70+
71+
if(ITEMS.containsKey(fqn) && ITEMS.get(fqn).containsKey(parameter.getProperty())) {
72+
parameter.addTarget(parameter.getPhpClass());
73+
}
74+
}
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package de.espend.idea.php.drupal.annotation;
2+
3+
import com.intellij.openapi.project.Project;
4+
import com.intellij.openapi.util.Key;
5+
import com.intellij.psi.util.CachedValue;
6+
import com.intellij.psi.util.CachedValueProvider;
7+
import com.intellij.psi.util.CachedValuesManager;
8+
import com.intellij.psi.util.PsiModificationTracker;
9+
import com.jetbrains.php.PhpIndex;
10+
import com.jetbrains.php.lang.psi.elements.PhpClass;
11+
import de.espend.idea.php.annotation.extension.PhpAnnotationGlobalNamespacesLoader;
12+
import de.espend.idea.php.annotation.extension.parameter.AnnotationGlobalNamespacesLoaderParameter;
13+
import org.apache.commons.lang.StringUtils;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.Collection;
17+
import java.util.HashSet;
18+
19+
/**
20+
* @author Daniel Espendiller <[email protected]>
21+
*/
22+
public class GlobalNamespaceLoader implements PhpAnnotationGlobalNamespacesLoader {
23+
24+
private static final Key<CachedValue<Collection<String>>> CACHE = new Key<>("DRUPAL_GLOBAL_NAMESPACE");
25+
26+
@Override
27+
@NotNull
28+
public Collection<String> getGlobalNamespaces(@NotNull AnnotationGlobalNamespacesLoaderParameter parameter) {
29+
Project project = parameter.getProject();
30+
31+
CachedValue<Collection<String>> cache = project.getUserData(CACHE);
32+
33+
if(cache == null) {
34+
cache = CachedValuesManager.getManager(project).createCachedValue(() ->
35+
CachedValueProvider.Result.create(getGlobalNamespacesInner(project), PsiModificationTracker.MODIFICATION_COUNT), false
36+
);
37+
38+
project.putUserData(CACHE, cache);
39+
}
40+
41+
return cache.getValue();
42+
}
43+
44+
@NotNull
45+
private static Collection<String> getGlobalNamespacesInner(@NotNull Project project) {
46+
Collection<String> namespaces = new HashSet<>();
47+
48+
for (PhpClass phpClass : PhpIndex.getInstance(project).getAllSubclasses("Drupal\\Component\\Annotation\\AnnotationInterface")) {
49+
String namespaceName = StringUtils.strip(phpClass.getNamespaceName(), "\\");
50+
if(namespaceName.endsWith("Annotation")) {
51+
namespaces.add(namespaceName);
52+
}
53+
}
54+
55+
return namespaces;
56+
}
57+
}

0 commit comments

Comments
 (0)