8000 add service id completion for xml attribute value on class attribute · Koc/idea-php-symfony2-plugin@b96882e · GitHub
[go: up one dir, main page]

Skip to content

Commit b96882e

Browse files
committed
add service id completion for xml attribute value on class attribute
1 parent 8328016 commit b96882e

File tree

4 files changed

+102
-38
lines changed

4 files changed

+102
-38
lines changed

src/fr/adrienbrault/idea/symfony2plugin/action/ui/SymfonyCreateService.java

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,16 @@
1414
import com.intellij.psi.xml.XmlTag;
1515
import com.intellij.ui.ToolbarDecorator;
1616
import com.intellij.ui.table.TableView;
17-
import com.intellij.util.Consumer;
1817
import com.intellij.util.ui.ColumnInfo;
1918
import com.intellij.util.ui.ListTableModel;
2019
import com.jetbrains.php.lang.psi.elements.*;
2120
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
2221
import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil;
23-
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.DefaultServiceNameStrategy;
24-
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.JavascriptServiceNameStrategy;
25-
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.ServiceNameStrategyInterface;
26-
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.ServiceNameStrategyParameter;
2722
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
2823
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
2924
import fr.adrienbrault.idea.symfony2plugin.ui.utils.ClassCompletionPanelWrapper;
3025
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
26+
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
3127
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
3228
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlPsiElementFactory;
3329
import org.apache.commons.lang.StringUtils;
@@ -37,15 +33,14 @@
3733
import org.jetbrains.yaml.psi.YAMLKeyValue;
3834

3935
import javax.swing.*;
40-
import javax.swing.event.*;
36+
import javax.swing.event.DocumentEvent;
37+
import javax.swing.event.DocumentListener;
4138
import javax.swing.table.TableCellEditor;
4239
import java.awt.*;
4340
import java.awt.datatransfer.Clipboard;
4441
import java.awt.datatransfer.DataFlavor;
4542
import java.awt.datatransfer.StringSelection;
4643
import java.awt.datatransfer.UnsupportedFlavorException;
47-
import java.awt.event.ActionEvent;
48-
import java.awt.event.ActionListener;
4944
import java.awt.event.KeyEvent;
5045
import java.io.IOException;
5146
import java.util.*;
@@ -98,11 +93,6 @@ public SymfonyCreateService(@NotNull final Project project, @Nullable PsiFile ps
9893
this.editor = editor;
9994
}
10095

101-
private static ServiceNameStrategyInterface[] NAME_STRATEGIES = new ServiceNameStrategyInterface[] {
102-
new JavascriptServiceNameStrategy(),
103-
new DefaultServiceNameStrategy(),
104-
};
105-
10696
public void init() {
10797

10898
setContentPane(panel1);
@@ -339,7 +329,7 @@ private void updateTask() {
339329
return;
340330
}
341331

342-
textFieldServiceName.setText(generateServiceName(className));
332+
textFieldServiceName.setText(ServiceUtil.getServiceNameForClass(project, className));
343333

344334
List<MethodParameter.MethodModelParameter> modelParameters = new ArrayList<>();
345335

@@ -564,25 +554,6 @@ public int compare(ContainerService o1, ContainerService o2) {
564554
}
565555
}
566556

567-
@NotNull
568-
private String generateServiceName(@NotNull String className) {
569-
570-
// normalize
571-
if(className.startsWith("\\")) {
572-
className = className.substring(1);
573-
}
574-
575-
ServiceNameStrategyParameter parameter = new ServiceNameStrategyParameter(project, className);
576-
for (ServiceNameStrategyInterface nameStrategy : NAME_STRATEGIES) {
577-
String serviceName = nameStrategy.getServiceName(parameter);
578-
if(serviceName != null && StringUtils.isNotBlank(serviceName)) {
579-
return serviceName;
580-
}
581-
}
582-
583-
return className.toLowerCase().replace("\\", "_");
584-
}
585-
586557
private static SymfonyCreateService prepare(@NotNull Component component, @NotNull SymfonyCreateService service) {
587558
service.init();
588559
service.setTitle("Symfony: Service Generator");

src/fr/adrienbrault/idea/symfony2plugin/completion/xml/XmlGotoCompletionRegistrar.java

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package fr.adrienbrault.idea.symfony2plugin.completion.xml;
22

33
import com.intellij.codeInsight.lookup.LookupElement;
4+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
45
import com.intellij.patterns.XmlPatterns;
56
import com.intellij.psi.PsiElement;
67
import com.intellij.psi.PsiFile;
7-
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionContributor;
8+
import com.intellij.psi.xml.XmlAttribute;
9+
import com.intellij.psi.xml.XmlAttributeValue;
10+
import com.intellij.psi.xml.XmlTag;
11+
import com.intellij.psi.xml.XmlToken;
12+
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
813
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider;
914
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
1015
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter;
1116
import fr.adrienbrault.idea.symfony2plugin.codeInsight.utils.GotoCompletionUtil;
1217
import fr.adrienbrault.idea.symfony2plugin.config.xml.XmlHelper;
18+
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
1319
import fr.adrienbrault.idea.symfony2plugin.util.resource.FileResourceUtil;
20+
import org.apache.commons.lang.StringUtils;
1421
import org.jetbrains.annotations.NotNull;
15-
import org.jetbrains.annotations.Nullable;
1622

1723
import java.util.ArrayList;
1824
import java.util.Collection;
@@ -22,10 +28,16 @@ public class XmlGotoCompletionRegistrar implements GotoCompletionRegistrar {
2228

2329
@Override
2430
public void register(GotoCompletionRegistrarParameter registrar) {
25-
2631
// <import resource="config_foo.xml"/>
2732
registrar.register(
28-
XmlPatterns.psiElement().withParent(XmlHelper.getImportResourcePattern()), ImportResourceGotoCompletionProvider::new
33+
XmlPatterns.psiElement().withParent(XmlHelper.getImportResourcePattern()),
34+
ImportResourceGotoCompletionProvider::new
35+
);
36+
37+
// <service id="<caret>" class="MyFoo\Foo\Apple"/>
38+
registrar.register(
39+
XmlPatterns.psiElement().withParent(XmlHelper.getServiceIdNamePattern()),
40+
ServiceIdCompletionProvider::new
2941
);
3042
}
3143

@@ -62,4 +74,44 @@ public Collection<PsiElement> getPsiTargets(PsiElement element) {
6274
return targets;
6375
}
6476
}
77+
78+
private static class ServiceIdCompletionProvider extends GotoCompletionProvider {
79+
private ServiceIdCompletionProvider(PsiElement element) {
80+
super(element);
81+
}
82+
83+
@NotNull
84+
@Override
85+
public Collection<LookupElement> getLookupElements() {
86+
Collection<LookupElement> lookupElements = new ArrayList<>();
87+
88+
// find class name of service tag
89+
PsiElement xmlToken = this.getElement();
90+
if(xmlToken instanceof XmlToken) {
91+
PsiElement xmlAttrValue = xmlToken.getParent();
92+
if(xmlAttrValue instanceof XmlAttributeValue) {
93+
PsiElement xmlAttribute = xmlAttrValue.getParent();
94+
if(xmlAttribute instanceof XmlAttribute) {
95+
PsiElement xmlTag = xmlAttribute.getParent();
96+
if(xmlTag instanceof XmlTag) {
97+
String aClass = ((XmlTag) xmlTag).getAttributeValue("class");
98+
if(aClass != null && StringUtils.isNotBlank(aClass)) {
99+
lookupElements.add(LookupElementBuilder.create(
100+
ServiceUtil.getServiceNameForClass(getProject(), aClass)).withIcon(Symfony2Icons.SERVICE)
101+
);
102+
}
103+
}
104+
}
105+
}
106+
}
107+
108+
return lookupElements;
109+
}
110+
111+
@NotNull
112+
@Override
113+
public Collection<PsiElement> getPsiTargets(PsiElement element) {
114+
return Collections.emptyList();
115+
}
116+
}
65117
}

src/fr/adrienbrault/idea/symfony2plugin/util/dict/ServiceUtil.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
import com.jetbrains.php.lang.psi.elements.Parameter;
2020
import com.jetbrains.php.lang.psi.elements.PhpClass;
2121
import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil;
22+
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.DefaultServiceNameStrategy;
23+
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.JavascriptServiceNameStrategy;
24+
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.ServiceNameStrategyInterface;
25+
import fr.adrienbrault.idea.symfony2plugin.action.generator.naming.ServiceNameStrategyParameter;
2226
import fr.adrienbrault.idea.symfony2plugin.dic.ContainerService;
2327
import fr.adrienbrault.idea.symfony2plugin.dic.XmlTagParser;
2428
import fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil;
@@ -38,7 +42,10 @@
3842
import java.util.*;
3943

4044
public class ServiceUtil {
41-
45+
private static ServiceNameStrategyInterface[] NAME_STRATEGIES = new ServiceNameStrategyInterface[] {
46+
new JavascriptServiceNameStrategy(),
47+
new DefaultServiceNameStrategy(),
48+
};
4249

4350
public static final Map<String , String> TAG_INTERFACES = new HashMap<String , String>() {{
4451
put("assetic.asset", "\\Assetic\\Filter\\FilterInterface");
@@ -526,4 +533,18 @@ public static Collection<ContainerService> getServiceSuggestionsForTypeHint(@Not
526533
return ServiceUtil.getServiceSuggestionForPhpClass(phpClass, services);
527534
}
528535

536+
@NotNull
537+
public static String getServiceNameForClass(@NotNull Project project, @NotNull String className) {
538+
className = StringUtils.stripStart(className, "\\");
539+
540+
ServiceNameStrategyParameter parameter = new ServiceNameStrategyParameter(project, className);
541+
for (ServiceNameStrategyInterface nameStrategy : NAME_STRATEGIES) {
542+
String serviceName = nameStrategy.getServiceName(parameter);
543+
if(serviceName != null && StringUtils.isNotBlank(serviceName)) {
544+
return serviceName;
545+
}
546+
}
547+
548+
return className.toLowerCase().replace("\\", "_");
549+
}
529550
}

tests/fr/adrienbrault/idea/symfony2plugin/tests/completion/xml/XmlGotoCompletionRegistrarTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,24 @@ public void testResourcesInsideSameDirectoryProvidesNavigation() {
2222
"config_foo.xml"
2323
);
2424
}
25+
26+
public void testIdInsideServiceTagShouldCompleteWithClassName() {
27+
assertCompletionContains(
28+
XmlFileType.INSTANCE,
29+
"<services><service id=\"<caret>\" class=\"MyFoo\\Foo\\Apple\"/></services>",
30+
"my_foo.foo.apple"
31+
);
32+
33+
assertCompletionNotContains(
34+
XmlFileType.INSTANCE,
35+
"<service id=\"<caret>\" class=\"MyFoo\\Foo\\Apple\"/>",
36+
"my_foo.foo.apple"
37+
);
38+
39+
assertCompletionNotContains(
40+
XmlFileType.INSTANCE,
41+
"<service id=\"<caret>\"/>",
42+
"my_foo.foo.apple"
43+
);
44+
}
2545
}

0 commit comments

Comments
 (0)
0