From 59f6b2a8a211bf4189958ce4bb307b1c3ffcc532 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Sun, 7 Apr 2013 23:23:36 +0200 Subject: [PATCH 0001/2872] Add support for request, service_container, kernel services --- .../symfony2plugin/SymfonyContainerTypeProvider.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 3a580e474..6f3805d1a 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -124,9 +124,16 @@ private String getServiceId(MethodReferenceImpl e) { NodeList servicesNodes = doc.getElementsByTagName("service"); for (int i = 0; i < servicesNodes.getLength(); i++) { Element node = (Element) servicesNodes.item(i); - map.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); + if (node.hasAttribute("class") && node.hasAttribute("id")) { + map.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); + } } + // Support services whose class isn't specified + map.put("request", "\\Symfony\\Component\\HttpFoundation\\Request"); + map.put("service_container", "\\Symfony\\Component\\DependencyInjection\\ContainerInterface"); + map.put("kernel", "\\Symfony\\Component\\HttpKernel\\KernelInterface"); + cachedServiceMap = map; cachedServiceMapLastModified = xmlFileLastModified; From eb260d5f5b0a55768364d4e76fd16da4e764466f Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Sun, 7 Apr 2013 23:54:24 +0200 Subject: [PATCH 0002/2872] Extract service map parsing logic to a class and test it --- .idea/libraries/junit_junit_4_9.xml | 11 ++++ lib/hamcrest-core-1.1.jar | Bin 0 -> 76643 bytes lib/junit-4.9.jar | Bin 0 -> 248994 bytes .../idea/symfony2plugin/ServiceMapParser.java | 52 ++++++++++++++++++ .../SymfonyContainerTypeProvider.java | 31 ++--------- symfony2-plugin.iml | 2 + .../tests/ServiceMapParserTest.java | 30 ++++++++++ 7 files changed, 99 insertions(+), 27 deletions(-) create mode 100644 .idea/libraries/junit_junit_4_9.xml create mode 100644 lib/hamcrest-core-1.1.jar create mode 100644 lib/junit-4.9.jar create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java create mode 100644 tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java diff --git a/.idea/libraries/junit_junit_4_9.xml b/.idea/libraries/junit_junit_4_9.xml new file mode 100644 index 000000000..9a40c94a5 --- /dev/null +++ b/.idea/libraries/junit_junit_4_9.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/lib/hamcrest-core-1.1.jar b/lib/hamcrest-core-1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..e5149be76e7b4faacb4c5e752065f3b26b2bafc7 GIT binary patch literal 76643 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

4wJKBoO7?Z0^;8^NhzY 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

0hs&;+8i5RbpPMZmo`D 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 z zC4gSteEzdpcz5HtYfIh5?&a);hJ&1Z{o1(_81i5Iv2y(efwpOYrvn^0D^1w*7x0A% zJ6u&s^&);35maTvGQ7%%f5GF3DRHNdCanQ{$1?o&-haX42rRpTMkZl_gy8!!{MhGz z!3&}LW8QALJZ#5806PGG?oQ6musG_Y1A81-i1P;dmgeZOO=o5$ zIV;DuKBo3?Td09!@USh^1pJ#EK=%`czB168_se$dF8Ph%Kr9GgDGJbSCv5bZ>+{f! ze690WXC2TSz+aGoUGCR%_1tz!+dG-t{q@r0OMwoh3D}C#2h%LbG{9^X;WAIeMMu~C zKqa$^0%*<#c0lIkw_rYUsh7L$oL3s1)n6#2O$V$#c#u}$qC#UK_R+F0{x=+RC7(X5 zJ1qx+Dj!;jG@`~Ls8^yotxQBzoI;J1KIXWFu|rI zf*ar_$gzewGY%vi^nh3ec{r{PjyOa85Nt{!c)X11!MY+7N3W)uc|3gpm~(T62veV7 zTak&QD+`R(%2NR+8;3xLEc=7)D>8BPUq^I0i7H`bl?sw>c7&cvTq`lrYv@6a5*M6J zBTxWMk(s=f2pVzzqhNFYIp*`yE zP}#qrUqYt6B9dsR`L##+g)fuOt*D`s8Fb$Kl!t;JgDOHU1$M~%1$q8_13J31o;Zpc z(2{^grjSnZe}#6pcCx_L1PH^~ZYzN`wu5nzde3I9YOl`61lszux$> z^p@Q}_)S{4@&C4tyz~mpKQh|jgWbzrZ{A<#gAU#eqf75*`vZ=LVF-TklAGF=PGT>; z4ebv)2o`v7p;uT1S$aR%ALw%v+|b321KmNEUfS>n8fuFMMaxWxATU4{vWjKZVN=+? KWCx9#;Qs+iBOPr3 literal 0 HcmV?d00001 diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java new file mode 100644 index 000000000..7a435637d --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java @@ -0,0 +1,52 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import org.w3c.dom.*; +import org.xml.sax.SAXException; + +import javax.xml.parsers.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class ServiceMapParser { + + private DocumentBuilder documentBuilder; + + public ServiceMapParser() throws ParserConfigurationException { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + documentBuilder = dbFactory.newDocumentBuilder(); + } + + public Map parse(InputStream stream) throws IOException, SAXException { + return parse(documentBuilder.parse(stream)); + } + + public Map parse(File file) throws IOException, SAXException { + return parse(documentBuilder.parse(file)); + } + + public Map parse(Document document) { + Map map = new HashMap(); + + NodeList servicesNodes = document.getElementsByTagName("service"); + for (int i = 0; i < servicesNodes.getLength(); i++) { + Element node = (Element) servicesNodes.item(i); + if (node.hasAttribute("class") && node.hasAttribute("id")) { + map.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); + } + } + + // Support services whose class isn't specified + map.put("request", "\\Symfony\\Component\\HttpFoundation\\Request"); + map.put("service_container", "\\Symfony\\Component\\DependencyInjection\\ContainerInterface"); + map.put("kernel", "\\Symfony\\Component\\HttpKernel\\KernelInterface"); + + return map; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 6f3805d1a..977d5476a 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -102,42 +102,19 @@ private String getServiceId(MethodReferenceImpl e) { return cachedServiceMap; } - Document doc = null; try { - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); - doc = dBuilder.parse(xmlFile); + ServiceMapParser serviceMapParser = new ServiceMapParser(); + cachedServiceMap = serviceMapParser.parse(xmlFile); + cachedServiceMapLastModified = xmlFileLastModified; } catch (SAXException e) { - e.printStackTrace(); - return map; } catch (IOException e) { - e.printStackTrace(); - return map; } catch (ParserConfigurationException e) { - e.printStackTrace(); - return map; } - NodeList servicesNodes = doc.getElementsByTagName("service"); - for (int i = 0; i < servicesNodes.getLength(); i++) { - Element node = (Element) servicesNodes.item(i); - if (node.hasAttribute("class") && node.hasAttribute("id")) { - map.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); - } - } - - // Support services whose class isn't specified - map.put("request", "\\Symfony\\Component\\HttpFoundation\\Request"); - map.put("service_container", "\\Symfony\\Component\\DependencyInjection\\ContainerInterface"); - map.put("kernel", "\\Symfony\\Component\\HttpKernel\\KernelInterface"); - - cachedServiceMap = map; - cachedServiceMapLastModified = xmlFileLastModified; - - return map; + return cachedServiceMap; } } diff --git a/symfony2-plugin.iml b/symfony2-plugin.iml index 7dc35dfc7..68623c429 100644 --- a/symfony2-plugin.iml +++ b/symfony2-plugin.iml @@ -5,11 +5,13 @@ + + diff --git a/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java b/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java new file mode 100644 index 000000000..f0ddd5a5c --- /dev/null +++ b/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java @@ -0,0 +1,30 @@ +package fr.adrienbrault.idea.symfony2plugin.tests; + +import fr.adrienbrault.idea.symfony2plugin.ServiceMapParser; +import org.junit.Test; +import org.junit.Assert; + +import java.io.ByteArrayInputStream; +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class ServiceMapParserTest extends Assert { + + @Test + public void testParse() throws Exception { + ServiceMapParser serviceMapParser = new ServiceMapParser(); + + String xmlString = "" + + ""; + Map serviceMap = serviceMapParser.parse(new ByteArrayInputStream(xmlString.getBytes())); + + assertEquals("\\AdrienBrault\\Awesome", serviceMap.get("adrienbrault")); + + assertEquals("\\Symfony\\Component\\HttpFoundation\\Request", serviceMap.get("request")); + assertEquals("\\Symfony\\Component\\DependencyInjection\\ContainerInterface", serviceMap.get("service_container")); + assertEquals("\\Symfony\\Component\\HttpKernel\\KernelInterface", serviceMap.get("kernel")); + } + +} From 9751b6265b022480fbcb174659e66268a2ec18f4 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 00:02:44 +0200 Subject: [PATCH 0003/2872] Should now work when multiple projects used --- .../SymfonyContainerTypeProvider.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 977d5476a..d825c60b0 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -8,7 +8,6 @@ import com.jetbrains.php.lang.psi.resolve.types.PhpType; import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider; import org.jetbrains.annotations.Nullable; -import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.*; @@ -22,6 +21,14 @@ */ public class SymfonyContainerTypeProvider implements PhpTypeProvider { + private Map> servicesMapsPerProject; + private Map servicesMapsLastModifiedPerProject; + + public SymfonyContainerTypeProvider() { + servicesMapsPerProject = new HashMap>(); + servicesMapsLastModifiedPerProject = new HashMap(); + } + @Nullable @Override public PhpType getType(PsiElement e) { @@ -85,9 +92,6 @@ private String getServiceId(MethodReferenceImpl e) { return serviceId; } - private Map cachedServiceMap; - private long cachedServiceMapLastModified; - private MapgetServicesMap(Project project) { Map map = new HashMap(); @@ -97,15 +101,16 @@ private String getServiceId(MethodReferenceImpl e) { return map; } - long xmlFileLastModified = xmlFile.lastModified(); - if (xmlFileLastModified == cachedServiceMapLastModified) { - return cachedServiceMap; + Long xmlFileLastModified = xmlFile.lastModified(); + if (xmlFileLastModified.equals(servicesMapsLastModifiedPerProject.get(project.getBasePath()))) { + return servicesMapsPerProject.get(project.getBasePath()); } try { ServiceMapParser serviceMapParser = new ServiceMapParser(); - cachedServiceMap = serviceMapParser.parse(xmlFile); - cachedServiceMapLastModified = xmlFileLastModified; + map = serviceMapParser.parse(xmlFile); + servicesMapsPerProject.put(project.getBasePath(), map); + servicesMapsLastModifiedPerProject.put(project.getBasePath(), xmlFileLastModified); } catch (SAXException e) { return map; } catch (IOException e) { @@ -114,7 +119,7 @@ private String getServiceId(MethodReferenceImpl e) { return map; } - return cachedServiceMap; + return map; } } From 1c97b558d4721754bda2b2ce45c9dbae6e00d120 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 00:06:06 +0200 Subject: [PATCH 0004/2872] Add license file and readme --- LICENSE | 19 +++++++++++++++++++ README.md | 4 ++++ 2 files changed, 23 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..af999db1b --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013 Adrien Brault + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..ff9693be2 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +IDEA PHP Symfony2 Plugin +======================== + +Plugin url : http://plugins.jetbrains.com/plugin?pr=&pluginId=7219 From d63eefc89e8f84e46f8b78e064d345f1f4f5e4a5 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 00:53:10 +0200 Subject: [PATCH 0005/2872] Fixes a bug causing exceptions on startup --- .../idea/symfony2plugin/SymfonyContainerTypeProvider.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index f5404d48c..a137ba2ad 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -1,5 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin; +import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.jetbrains.php.lang.psi.elements.impl.MethodImpl; @@ -32,6 +33,10 @@ public SymfonyContainerTypeProvider() { @Nullable @Override public PhpType getType(PsiElement e) { + if (DumbService.getInstance(e.getProject()).isDumb()) { + return null; + } + if (!isContainerGetCall(e)) { return null; } From 5b301065a8a203249079dae6909557f743f4922e Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 00:53:36 +0200 Subject: [PATCH 0006/2872] Fix xml file path building --- .../idea/symfony2plugin/SymfonyContainerTypeProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index a137ba2ad..95e3bb8b1 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -100,7 +100,7 @@ private String getServiceId(MethodReferenceImpl e) { private MapgetServicesMap(Project project) { Map map = new HashMap(); - String defaultServiceMapFilePath = project.getBasePath() + Settings.getInstance(project).pathToProjectContainer; + String defaultServiceMapFilePath = project.getBasePath() + "/" + Settings.getInstance(project).pathToProjectContainer; File xmlFile = new File(defaultServiceMapFilePath); if (!xmlFile.exists()) { return map; From 2bc33691c0f496788b728177d14598918f2a9b37 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 00:58:54 +0200 Subject: [PATCH 0007/2872] Build 0.2.0 --- CHANGELOG.md | 10 ++++++++++ META-INF/plugin.xml | 2 +- symfony2-plugin.jar | Bin 4101 -> 7906 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..afcfa97f8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +Changelog +========= + +### 0.2.0 + +* The `appDevDebugProjectContainer.xml` path can now be configured in the project settings. + +### 0.1.0 + +* Detect ContainerInterface::get result type diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index e73e6c7b9..2de31750c 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.1.0 + 0.2.0 Adrien Brault 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 delta 3350 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 F{|}w*M{xiE From 511615a5e5d66aa50f0a915c6810ced9154795db Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 11:41:36 +0300 Subject: [PATCH 0008/2872] Readme: add a note on how to install the plugin --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index ff9693be2..86714b8df 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,12 @@ IDEA PHP Symfony2 Plugin ======================== Plugin url : http://plugins.jetbrains.com/plugin?pr=&pluginId=7219 + +Installing the plugin +--------------------- + +The plugin has not yet ( 2013-04-08 ) been approved by Jetbrains on http://plugins.jetbrains.com/plugin?pr=&pluginId=7219 . + +So you currently need to download the plugin .jar from github and then install it in phpstorm: `Settings -> Plugins -> Install plugin from disk`. + +Note that the plugin requires that you have the latest PHPStorm EAP build, available at http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Early+Access+Program From 432e2309cb6934ff459849db7be40eb29b76ab99 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 11:58:47 +0300 Subject: [PATCH 0009/2872] Update installation notes --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 86714b8df..f06e68b68 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,10 @@ Plugin url : http://plugins.jetbrains.com/plugin?pr=&pluginId=7219 Installing the plugin --------------------- -The plugin has not yet ( 2013-04-08 ) been approved by Jetbrains on http://plugins.jetbrains.com/plugin?pr=&pluginId=7219 . +The plugin requires that you have the latest PHPStorm EAP build (6.0.1 EAP 129.196, Apr 5), available at http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Early+Access+Program + +You can install the plugin by going to `Settings -> Plugin -> Browse repositories` and then search for `Symfony2`. **RECOMMENDED WAY** + +You can also [download the plugin .jar from github](https://github.com/adrienbrault/idea-php-symfony2-plugin/raw/master/symfony2-plugin.jar) and then install it in phpstorm: `Settings -> Plugins -> Install plugin from disk`. -So you currently need to download the plugin .jar from github and then install it in phpstorm: `Settings -> Plugins -> Install plugin from disk`. -Note that the plugin requires that you have the latest PHPStorm EAP build, available at http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Early+Access+Program From 9109ce6e638ff75d023bd68a745af3ecca9634ed Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Mon, 8 Apr 2013 14:22:21 +0200 Subject: [PATCH 0010/2872] Fixes build requirement --- META-INF/plugin.xml | 4 ++-- symfony2-plugin.jar | Bin 7906 -> 7906 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 2de31750c..9e31ebc39 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.2.0 + 0.2.1 Adrien Brault - + diff --git a/symfony2-plugin.jar b/symfony2-plugin.jar index 3f38dd348aea80f2cb933e9a0bee39504f8b1a5b..43a437684ed0bd4cedf109e23b2cc8588973bc25 100644 GIT binary patch delta 450 zcmV;z0X_cWJ>oqKP)h>@6aWYS2mpX`u?%q;0()|ke;Ft?Zrd;nz2_@bpE?wlnj8i+ zaEzr%2INu{Ytc*5gJRQ;0$DO7I#~XGl&vIgPsMyOOg=u6@6nUp89jgR`HW99asC`q zrnHVhBb8nxLqk4v{8fh_FKm;r&QW%c*v^IcG*#u2eAx%sV;>3hfij;2`VxHMREwcq zcJsbkFJG7MlnBpd-eDO&iSbqE92nFmRsuqSY-J5fWx#C>f~#Z!^LY(;`-3^~)RN(; z1s<-)1qy2_-GM299{@=S zWjr^4qEx=s@+7wF&2qhY6OWzJ<=s=)?7-dq3FMwtB==}OmZs5hx`yZs^NP6BU8r6p z)7b-`KKx9?FcSPlFahO>rV5g8&XFg-NXRa(NGGk;p}!?6Y4oqKP)h>@6aWYS2mrPQu?%q;0+s}me;Ft?YU3~vz2_@bpSl!FX<%6h zj@dLxA(v9NrI*r!VvijKSu)Z%Z2o>nwvxC#mG#AV=FOX#_r{am89jfee8#7lIDZZ) zQ(DKMkxDO;p&=hS{;ori7q&@Q=P0{JZ0ACJnyPY1zU%|+p^pUmK$%YheF?sBs>RSQ zyLn%&m#@orN`&V!@30J?#Q3Un4h-rOD*>TEwz3ALGT^ob!Bw(=`Md_a{lOe~YRT}_ z0*}=nA9*ImZTmTjy)=I{q{brn(ID5F01}^2ecer((s&>}Fb}|@0);h|?!Xkl4}heE zGM*biQ7YeRc@o?8X1U(HiHA<<^6sf?cHr**1ai+Rl6y2COVj8$T|;z+c}3jmE>tg) z`{^%!KmD1AVI=sAU;@e$O%){HoFh+uk&s Date: Mon, 8 Apr 2013 14:24:33 +0200 Subject: [PATCH 0011/2872] Update changelog about 0.2.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afcfa97f8..f42dce2d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========= +### 0.2.1 + +* Fixed required idea build + ### 0.2.0 * The `appDevDebugProjectContainer.xml` path can now be configured in the project settings. From e1a6fc4e8cc58e5bf62e0aa643607cba6d64417a Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Tue, 9 Apr 2013 02:47:01 +0200 Subject: [PATCH 0012/2872] Avoid using psi impl types --- .../SymfonyContainerTypeProvider.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 95e3bb8b1..990db631f 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -3,9 +3,9 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; -import com.jetbrains.php.lang.psi.elements.impl.MethodImpl; -import com.jetbrains.php.lang.psi.elements.impl.MethodReferenceImpl; -import com.jetbrains.php.lang.psi.elements.impl.StringLiteralExpressionImpl; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.MethodReference; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.jetbrains.php.lang.psi.resolve.types.PhpType; import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider; import org.jetbrains.annotations.Nullable; @@ -41,7 +41,7 @@ public PhpType getType(PsiElement e) { return null; } - String serviceId = getServiceId((MethodReferenceImpl) e); + String serviceId = getServiceId((MethodReference) e); if (null == serviceId) { return null; } @@ -57,22 +57,22 @@ public PhpType getType(PsiElement e) { } private boolean isContainerGetCall(PsiElement e) { - if (!(e instanceof MethodReferenceImpl)) { + if (!(e instanceof MethodReference)) { return false; } - MethodReferenceImpl methodRefImpl = (MethodReferenceImpl) e; + MethodReference methodRef = (MethodReference) e; if (null == e.getReference()) { return false; } - PsiElement resolvedReference = methodRefImpl.getReference().resolve(); - if (!(resolvedReference instanceof MethodImpl)) { + PsiElement resolvedReference = methodRef.getReference().resolve(); + if (!(resolvedReference instanceof Method)) { return false; } - MethodImpl methodImpl = (MethodImpl) resolvedReference; - String methodFQN = methodImpl.getFQN(); // Something like "\Symfony\Bundle\FrameworkBundle\Controller\Controller.get" + Method method = (Method) resolvedReference; + String methodFQN = method.getFQN(); // Something like "\Symfony\Bundle\FrameworkBundle\Controller\Controller.get" if (null == methodFQN) { return false; } @@ -85,11 +85,11 @@ private boolean isContainerGetCall(PsiElement e) { return false; } - private String getServiceId(MethodReferenceImpl e) { + private String getServiceId(MethodReference e) { String serviceId = null; PsiElement[] parameters = e.getParameters(); - if (parameters.length > 0 && parameters[0] instanceof StringLiteralExpressionImpl) { + if (parameters.length > 0 && parameters[0] instanceof StringLiteralExpression) { serviceId = parameters[0].getText(); // quoted string serviceId = serviceId.substring(1, serviceId.length() - 1); } From 904d425034b7372778f17d4c198b99345b7d2a96 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Tue, 9 Apr 2013 03:31:53 +0200 Subject: [PATCH 0013/2872] Support all ContainerInterface::get proxy as long as the id is the first argument --- .../SymfonyContainerTypeProvider.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 990db631f..059311648 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -3,6 +3,8 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; +import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpReturnInstruction; import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; @@ -57,6 +59,11 @@ public PhpType getType(PsiElement e) { } private boolean isContainerGetCall(PsiElement e) { + return isContainerGetCall(e, 1); + } + + private boolean isContainerGetCall(PsiElement e, int deepness) { + // ((Method)((MethodReference)((PhpReturnInstruction)((Method)((MethodReference)e).getReference().resolve()).getControlFlow().getInstructions()[6]).getArgument()).getReference().resolve()).getFQN() if (!(e instanceof MethodReference)) { return false; } @@ -77,11 +84,33 @@ private boolean isContainerGetCall(PsiElement e) { return false; } - if (methodFQN.equals("\\Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller.get") - || methodFQN.equals("\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get")) { + String expectedMethodFQN = "\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get"; + if (methodFQN.equals(expectedMethodFQN)) { return true; } + if (deepness > 3) { + return false; + } + + // Try to see if this method return expression is a method call to a ContainerInterface::get ... recursive! + + PhpInstruction[] instructions = method.getControlFlow().getInstructions(); + for (int i = 0; i < instructions.length; i++) { + PhpInstruction instruction = instructions[i]; + + if (instruction instanceof PhpReturnInstruction) { + PhpReturnInstruction returnInstruction = (PhpReturnInstruction) instruction; + + PsiElement returnInstructionElement = returnInstruction.getArgument(); + if (null != returnInstructionElement && + null != returnInstructionElement.getReference() && + returnInstructionElement.getReference().resolve() != resolvedReference) { // Avoid stackoverflow with method calling itself + return isContainerGetCall(returnInstructionElement, deepness + 1); + } + } + } + return false; } From 61b8563e91ff66c3323c6ef499a7c48019b0cc1d Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 09:20:28 +0200 Subject: [PATCH 0014/2872] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f42dce2d2..f63dbddf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========= +### 0.2.2 + +* Should support all ContainerInterface::get proxies as long as the id is the first argument + (Previously, only direct calls to ContainerInterface::get or Controller::get) + ### 0.2.1 * Fixed required idea build From d8a6ef851ae82da039c7c173a054da47c4138bb6 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 09:20:50 +0200 Subject: [PATCH 0015/2872] The service map is now stored in a project component --- META-INF/plugin.xml | 39 ++++++---- .../Symfony2ProjectComponent.java | 77 +++++++++++++++++++ .../SymfonyContainerTypeProvider.java | 50 +----------- 3 files changed, 101 insertions(+), 65 deletions(-) create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 9e31ebc39..f8fbfeab0 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,29 +1,34 @@ - fr.adrienbrault.idea.symfony2plugin - Symfony2 Plugin - 0.2.1 - Adrien Brault + fr.adrienbrault.idea.symfony2plugin + Symfony2 Plugin + 0.2.1 + Adrien Brault - - - + ]]> + - - + + - - - - - + + + + + - com.jetbrains.php - com.intellij.modules.platform + com.jetbrains.php + com.intellij.modules.platform + + + fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent + + diff --git a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java new file mode 100644 index 000000000..fe4ef53e5 --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java @@ -0,0 +1,77 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class Symfony2ProjectComponent implements ProjectComponent { + + private Project project; + private Map servicesMap; + private Long servicesMapLastModified; + + public Symfony2ProjectComponent(Project project) { + this.project = project; + } + + public void initComponent() { + System.out.println("initComponent"); + } + + public void disposeComponent() { + System.out.println("disposeComponent"); + } + + @NotNull + public String getComponentName() { + return "Symfony2ProjectComponent"; + } + + public void projectOpened() { + System.out.println("projectOpened"); + } + + public void projectClosed() { + System.out.println("projectClosed"); + } + + public Map getServicesMap() { + Map map = new HashMap(); + + String defaultServiceMapFilePath = project.getBasePath() + "/" + Settings.getInstance(project).pathToProjectContainer; + File xmlFile = new File(defaultServiceMapFilePath); + if (!xmlFile.exists()) { + return map; + } + + Long xmlFileLastModified = xmlFile.lastModified(); + if (xmlFileLastModified.equals(servicesMapLastModified)) { + return servicesMap; + } + + try { + ServiceMapParser serviceMapParser = new ServiceMapParser(); + servicesMap = serviceMapParser.parse(xmlFile); + servicesMapLastModified = xmlFileLastModified; + } catch (SAXException e) { + return map; + } catch (IOException e) { + return map; + } catch (ParserConfigurationException e) { + return map; + } + + return map; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index 059311648..f8f6c6205 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -1,7 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin; import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpReturnInstruction; @@ -11,27 +10,12 @@ import com.jetbrains.php.lang.psi.resolve.types.PhpType; import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider; import org.jetbrains.annotations.Nullable; -import org.xml.sax.SAXException; - -import javax.xml.parsers.*; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; /** * @author Adrien Brault */ public class SymfonyContainerTypeProvider implements PhpTypeProvider { - private Map> servicesMapsPerProject; - private Map servicesMapsLastModifiedPerProject; - - public SymfonyContainerTypeProvider() { - servicesMapsPerProject = new HashMap>(); - servicesMapsLastModifiedPerProject = new HashMap(); - } - @Nullable @Override public PhpType getType(PsiElement e) { @@ -48,8 +32,8 @@ public PhpType getType(PsiElement e) { return null; } - Map serviceMap = getServicesMap(e.getProject()); - String serviceClass = serviceMap.get(serviceId); + Symfony2ProjectComponent symfony2ProjectComponent = e.getProject().getComponent(Symfony2ProjectComponent.class); + String serviceClass = symfony2ProjectComponent.getServicesMap().get(serviceId); if (null == serviceClass) { return null; @@ -126,34 +110,4 @@ private String getServiceId(MethodReference e) { return serviceId; } - private MapgetServicesMap(Project project) { - Map map = new HashMap(); - - String defaultServiceMapFilePath = project.getBasePath() + "/" + Settings.getInstance(project).pathToProjectContainer; - File xmlFile = new File(defaultServiceMapFilePath); - if (!xmlFile.exists()) { - return map; - } - - Long xmlFileLastModified = xmlFile.lastModified(); - if (xmlFileLastModified.equals(servicesMapsLastModifiedPerProject.get(project.getBasePath()))) { - return servicesMapsPerProject.get(project.getBasePath()); - } - - try { - ServiceMapParser serviceMapParser = new ServiceMapParser(); - map = serviceMapParser.parse(xmlFile); - servicesMapsPerProject.put(project.getBasePath(), map); - servicesMapsLastModifiedPerProject.put(project.getBasePath(), xmlFileLastModified); - } catch (SAXException e) { - return map; - } catch (IOException e) { - return map; - } catch (ParserConfigurationException e) { - return map; - } - - return map; - } - } From 32e7083b0c2348c93cf1063285cd09a623b5f3a3 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 11:45:10 +0200 Subject: [PATCH 0016/2872] Service id are clickable and auto completable (ctrl + space) --- .idea/codeStyleSettings.xml | 9 ++ META-INF/plugin.xml | 1 + .../symfony2plugin/ContainerGetHelper.java | 82 ++++++++++++++++++ .../idea/symfony2plugin/ServiceMap.java | 26 ++++++ .../idea/symfony2plugin/ServiceMapParser.java | 19 +++-- .../idea/symfony2plugin/ServiceReference.java | 83 +++++++++++++++++++ .../ServiceReferenceContributor.java | 41 +++++++++ .../Symfony2ProjectComponent.java | 19 ++--- .../SymfonyContainerTypeProvider.java | 78 ++--------------- .../tests/ServiceMapParserTest.java | 29 +++++-- 10 files changed, 291 insertions(+), 96 deletions(-) create mode 100644 .idea/codeStyleSettings.xml create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 000000000..1129f0010 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index f8fbfeab0..458ccd696 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -20,6 +20,7 @@ + diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java b/src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java new file mode 100644 index 000000000..e7a99d7ef --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java @@ -0,0 +1,82 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import com.intellij.psi.PsiElement; +import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; +import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpReturnInstruction; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.MethodReference; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; + +/** + * @author Adrien Brault + */ +public class ContainerGetHelper { + + public static boolean isContainerGetCall(PsiElement e) { + return isContainerGetCall(e, 1); + } + + public static boolean isContainerGetCall(PsiElement e, int deepness) { + if (!(e instanceof MethodReference)) { + return false; + } + + MethodReference methodRef = (MethodReference) e; + if (null == e.getReference()) { + return false; + } + + PsiElement resolvedReference = methodRef.getReference().resolve(); + if (!(resolvedReference instanceof Method)) { + return false; + } + + Method method = (Method) resolvedReference; + String methodFQN = method.getFQN(); // Something like "\Symfony\Bundle\FrameworkBundle\Controller\Controller.get" + if (null == methodFQN) { + return false; + } + + String expectedMethodFQN = "\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get"; + if (methodFQN.equals(expectedMethodFQN)) { + return true; + } + + if (deepness > 3) { + return false; + } + + // Try to see if this method return expression is a method call to a ContainerInterface::get ... recursive! + + PhpInstruction[] instructions = method.getControlFlow().getInstructions(); + for (int i = 0; i < instructions.length; i++) { + PhpInstruction instruction = instructions[i]; + + if (instruction instanceof PhpReturnInstruction) { + PhpReturnInstruction returnInstruction = (PhpReturnInstruction) instruction; + + PsiElement returnInstructionElement = returnInstruction.getArgument(); + if (null != returnInstructionElement && + null != returnInstructionElement.getReference() && + returnInstructionElement.getReference().resolve() != resolvedReference) { // Avoid stackoverflow with method calling itself + return isContainerGetCall(returnInstructionElement, deepness + 1); + } + } + } + + return false; + } + + public static String getServiceId(MethodReference e) { + String serviceId = null; + + PsiElement[] parameters = e.getParameters(); + if (parameters.length > 0 && parameters[0] instanceof StringLiteralExpression) { + serviceId = parameters[0].getText(); // quoted string + serviceId = serviceId.substring(1, serviceId.length() - 1); + } + + return serviceId; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java new file mode 100644 index 000000000..22f1374b3 --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java @@ -0,0 +1,26 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class ServiceMap { + + private Map map; + private Map publicMap; + + public ServiceMap(Map map, Map publicMap) { + this.map = map; + this.publicMap = publicMap; + } + + public Map getMap() { + return map; + } + + public Map getPublicMap() { + return publicMap; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java index 7a435637d..1db684d35 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java @@ -22,16 +22,17 @@ public ServiceMapParser() throws ParserConfigurationException { documentBuilder = dbFactory.newDocumentBuilder(); } - public Map parse(InputStream stream) throws IOException, SAXException { + public ServiceMap parse(InputStream stream) throws IOException, SAXException { return parse(documentBuilder.parse(stream)); } - public Map parse(File file) throws IOException, SAXException { + public ServiceMap parse(File file) throws IOException, SAXException { return parse(documentBuilder.parse(file)); } - public Map parse(Document document) { + public ServiceMap parse(Document document) { Map map = new HashMap(); + Map publicMap = new HashMap(); NodeList servicesNodes = document.getElementsByTagName("service"); for (int i = 0; i < servicesNodes.getLength(); i++) { @@ -39,14 +40,22 @@ public Map parse(Document document) { if (node.hasAttribute("class") && node.hasAttribute("id")) { map.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); } + if (!(node.hasAttribute("public") && node.getAttribute("public").equals("false"))) { + publicMap.put(node.getAttribute("id"), "\\" + node.getAttribute("class")); + } } // Support services whose class isn't specified + populateMapWithDefaultServices(map); + populateMapWithDefaultServices(publicMap); + + return new ServiceMap(map, publicMap); + } + + private void populateMapWithDefaultServices(Map map) { map.put("request", "\\Symfony\\Component\\HttpFoundation\\Request"); map.put("service_container", "\\Symfony\\Component\\DependencyInjection\\ContainerInterface"); map.put("kernel", "\\Symfony\\Component\\HttpKernel\\KernelInterface"); - - return map; } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java new file mode 100644 index 000000000..95bfe425c --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java @@ -0,0 +1,83 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.indexing.FileBasedIndex; +import com.jetbrains.php.PhpIndex; +import com.jetbrains.php.lang.PhpFileType; +import com.jetbrains.php.lang.psi.PhpFile; +import com.jetbrains.php.lang.psi.elements.ClassReference; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * @author Adrien Brault + */ +public class ServiceReference extends PsiReferenceBase implements PsiPolyVariantReference { + + private String serviceId; + + public ServiceReference(@NotNull StringLiteralExpression element) { + super(element); + + serviceId = element.getText().substring( + element.getValueRange().getStartOffset(), + element.getValueRange().getEndOffset() + ); // Remove quotes + } + + @NotNull + @Override + public ResolveResult[] multiResolve(boolean incompleteCode) { + // Return the PsiElement for the class corresponding to the serviceId + Symfony2ProjectComponent symfony2ProjectComponent = getElement().getProject().getComponent(Symfony2ProjectComponent.class); + if (null == symfony2ProjectComponent) { + return null; + } + + String serviceClass = symfony2ProjectComponent.getServicesMap().getMap().get(serviceId); + + if (null == serviceClass) { + return null; + } + + PhpIndex phpIndex = PhpIndex.getInstance(getElement().getProject()); + Collection phpClasses = phpIndex.getClassesByFQN(serviceClass); + + List results = new ArrayList(); + for (PhpClass phpClass : phpClasses) { + results.add(new PsiElementResolveResult(phpClass)); + } + + return results.toArray(new ResolveResult[results.size()]); + } + + @Nullable + @Override + public PsiElement resolve() { + ResolveResult[] resolveResults = multiResolve(false); + + return resolveResults.length == 1 ? resolveResults[0].getElement() : null; + } + + @NotNull + @Override + public Object[] getVariants() { + Symfony2ProjectComponent symfony2ProjectComponent = getElement().getProject().getComponent(Symfony2ProjectComponent.class); + + return symfony2ProjectComponent.getServicesMap().getPublicMap().keySet().toArray(); + } +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java new file mode 100644 index 000000000..6c0ae3c41 --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java @@ -0,0 +1,41 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.MethodReference; +import com.jetbrains.php.lang.psi.elements.ParameterList; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import org.jetbrains.annotations.NotNull; + +/** + * @author Adrien Brault + */ +public class ServiceReferenceContributor extends PsiReferenceContributor { + + @Override + public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { + psiReferenceRegistrar.registerReferenceProvider(PlatformPatterns.psiElement(StringLiteralExpression.class), new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { + ParameterList parameterList = (ParameterList) psiElement.getContext(); + if (!(parameterList instanceof ParameterList)) { + return new PsiReference[0]; + } + + MethodReference method = (MethodReference) parameterList.getContext(); + if (!(method instanceof MethodReference)) { + return new PsiReference[0]; + } + + if (!ContainerGetHelper.isContainerGetCall(method)) { + return new PsiReference[0]; + } + + return new PsiReference[]{ new ServiceReference((StringLiteralExpression) psiElement) }; + } + }); + } +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java index fe4ef53e5..dec3d9099 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java @@ -17,7 +17,7 @@ public class Symfony2ProjectComponent implements ProjectComponent { private Project project; - private Map servicesMap; + private ServiceMap servicesMap; private Long servicesMapLastModified; public Symfony2ProjectComponent(Project project) { @@ -45,13 +45,11 @@ public void projectClosed() { System.out.println("projectClosed"); } - public Map getServicesMap() { - Map map = new HashMap(); - + public ServiceMap getServicesMap() { String defaultServiceMapFilePath = project.getBasePath() + "/" + Settings.getInstance(project).pathToProjectContainer; File xmlFile = new File(defaultServiceMapFilePath); if (!xmlFile.exists()) { - return map; + return null; } Long xmlFileLastModified = xmlFile.lastModified(); @@ -63,15 +61,12 @@ public Map getServicesMap() { ServiceMapParser serviceMapParser = new ServiceMapParser(); servicesMap = serviceMapParser.parse(xmlFile); servicesMapLastModified = xmlFileLastModified; - } catch (SAXException e) { - return map; - } catch (IOException e) { - return map; - } catch (ParserConfigurationException e) { - return map; + } catch (SAXException ignored) { + } catch (IOException ignored) { + } catch (ParserConfigurationException ignored) { } - return map; + return null; } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java index f8f6c6205..419f14c30 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java @@ -23,17 +23,21 @@ public PhpType getType(PsiElement e) { return null; } - if (!isContainerGetCall(e)) { + if (!ContainerGetHelper.isContainerGetCall(e)) { return null; } - String serviceId = getServiceId((MethodReference) e); + String serviceId = ContainerGetHelper.getServiceId((MethodReference) e); if (null == serviceId) { return null; } Symfony2ProjectComponent symfony2ProjectComponent = e.getProject().getComponent(Symfony2ProjectComponent.class); - String serviceClass = symfony2ProjectComponent.getServicesMap().get(serviceId); + ServiceMap serviceMap = symfony2ProjectComponent.getServicesMap(); + if (null == serviceMap) { + return null; + } + String serviceClass = serviceMap.getMap().get(serviceId); if (null == serviceClass) { return null; @@ -42,72 +46,4 @@ public PhpType getType(PsiElement e) { return new PhpType().add(serviceClass); } - private boolean isContainerGetCall(PsiElement e) { - return isContainerGetCall(e, 1); - } - - private boolean isContainerGetCall(PsiElement e, int deepness) { - // ((Method)((MethodReference)((PhpReturnInstruction)((Method)((MethodReference)e).getReference().resolve()).getControlFlow().getInstructions()[6]).getArgument()).getReference().resolve()).getFQN() - if (!(e instanceof MethodReference)) { - return false; - } - - MethodReference methodRef = (MethodReference) e; - if (null == e.getReference()) { - return false; - } - - PsiElement resolvedReference = methodRef.getReference().resolve(); - if (!(resolvedReference instanceof Method)) { - return false; - } - - Method method = (Method) resolvedReference; - String methodFQN = method.getFQN(); // Something like "\Symfony\Bundle\FrameworkBundle\Controller\Controller.get" - if (null == methodFQN) { - return false; - } - - String expectedMethodFQN = "\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get"; - if (methodFQN.equals(expectedMethodFQN)) { - return true; - } - - if (deepness > 3) { - return false; - } - - // Try to see if this method return expression is a method call to a ContainerInterface::get ... recursive! - - PhpInstruction[] instructions = method.getControlFlow().getInstructions(); - for (int i = 0; i < instructions.length; i++) { - PhpInstruction instruction = instructions[i]; - - if (instruction instanceof PhpReturnInstruction) { - PhpReturnInstruction returnInstruction = (PhpReturnInstruction) instruction; - - PsiElement returnInstructionElement = returnInstruction.getArgument(); - if (null != returnInstructionElement && - null != returnInstructionElement.getReference() && - returnInstructionElement.getReference().resolve() != resolvedReference) { // Avoid stackoverflow with method calling itself - return isContainerGetCall(returnInstructionElement, deepness + 1); - } - } - } - - return false; - } - - private String getServiceId(MethodReference e) { - String serviceId = null; - - PsiElement[] parameters = e.getParameters(); - if (parameters.length > 0 && parameters[0] instanceof StringLiteralExpression) { - serviceId = parameters[0].getText(); // quoted string - serviceId = serviceId.substring(1, serviceId.length() - 1); - } - - return serviceId; - } - } diff --git a/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java b/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java index f0ddd5a5c..a2f3eb4a1 100644 --- a/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java +++ b/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java @@ -1,5 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin.tests; +import fr.adrienbrault.idea.symfony2plugin.ServiceMap; import fr.adrienbrault.idea.symfony2plugin.ServiceMapParser; import org.junit.Test; import org.junit.Assert; @@ -17,14 +18,26 @@ public void testParse() throws Exception { ServiceMapParser serviceMapParser = new ServiceMapParser(); String xmlString = "" + - ""; - Map serviceMap = serviceMapParser.parse(new ByteArrayInputStream(xmlString.getBytes())); - - assertEquals("\\AdrienBrault\\Awesome", serviceMap.get("adrienbrault")); - - assertEquals("\\Symfony\\Component\\HttpFoundation\\Request", serviceMap.get("request")); - assertEquals("\\Symfony\\Component\\DependencyInjection\\ContainerInterface", serviceMap.get("service_container")); - assertEquals("\\Symfony\\Component\\HttpKernel\\KernelInterface", serviceMap.get("kernel")); + "" + + "" + + "" + + ""; + ServiceMap serviceMap = serviceMapParser.parse(new ByteArrayInputStream(xmlString.getBytes())); + + assertTrue(serviceMap instanceof ServiceMap); + + assertEquals("\\AdrienBrault\\Awesome", serviceMap.getMap().get("adrienbrault")); + assertEquals("\\AdrienBrault\\Awesome", serviceMap.getPublicMap().get("adrienbrault")); + + assertEquals("\\AdrienBrault\\Secret", serviceMap.getMap().get("secret")); + assertNull(serviceMap.getPublicMap().get("secret")); + + assertEquals("\\Symfony\\Component\\HttpFoundation\\Request", serviceMap.getMap().get("request")); + assertEquals("\\Symfony\\Component\\HttpFoundation\\Request", serviceMap.getPublicMap().get("request")); + assertEquals("\\Symfony\\Component\\DependencyInjection\\ContainerInterface", serviceMap.getMap().get("service_container")); + assertEquals("\\Symfony\\Component\\DependencyInjection\\ContainerInterface", serviceMap.getPublicMap().get("service_container")); + assertEquals("\\Symfony\\Component\\HttpKernel\\KernelInterface", serviceMap.getMap().get("kernel")); + assertEquals("\\Symfony\\Component\\HttpKernel\\KernelInterface", serviceMap.getPublicMap().get("kernel")); } } From 5e6623af42d739dbb64f5786306b0b770bcd7ced Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 11:54:32 +0200 Subject: [PATCH 0017/2872] Fix some NullPointerThingException --- src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java | 6 ++++++ .../adrienbrault/idea/symfony2plugin/ServiceReference.java | 4 ++-- .../idea/symfony2plugin/Symfony2ProjectComponent.java | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java index 22f1374b3..a34f7e5c2 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java @@ -1,5 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin; +import java.util.HashMap; import java.util.Map; /** @@ -15,6 +16,11 @@ public ServiceMap(Map map, Map publicMap) { this.publicMap = publicMap; } + public ServiceMap() { + this.map = new HashMap(); + this.publicMap = new HashMap(); + } + public Map getMap() { return map; } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java index 95bfe425c..1ae45a474 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java @@ -45,13 +45,13 @@ public ResolveResult[] multiResolve(boolean incompleteCode) { // Return the PsiElement for the class corresponding to the serviceId Symfony2ProjectComponent symfony2ProjectComponent = getElement().getProject().getComponent(Symfony2ProjectComponent.class); if (null == symfony2ProjectComponent) { - return null; + return new ResolveResult[]{}; } String serviceClass = symfony2ProjectComponent.getServicesMap().getMap().get(serviceId); if (null == serviceClass) { - return null; + return new ResolveResult[]{}; } PhpIndex phpIndex = PhpIndex.getInstance(getElement().getProject()); diff --git a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java index dec3d9099..76fabb12c 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java @@ -49,7 +49,7 @@ public ServiceMap getServicesMap() { String defaultServiceMapFilePath = project.getBasePath() + "/" + Settings.getInstance(project).pathToProjectContainer; File xmlFile = new File(defaultServiceMapFilePath); if (!xmlFile.exists()) { - return null; + return new ServiceMap(); } Long xmlFileLastModified = xmlFile.lastModified(); @@ -66,7 +66,7 @@ public ServiceMap getServicesMap() { } catch (ParserConfigurationException ignored) { } - return null; + return new ServiceMap(); } } From cd44e690123c3a039ad50a933387087984bd96ea Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 12:49:09 +0200 Subject: [PATCH 0018/2872] Fix possible ClassCastException --- .../idea/symfony2plugin/ServiceReferenceContributor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java index 6c0ae3c41..61b16c848 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java @@ -20,15 +20,15 @@ public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistr @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { - ParameterList parameterList = (ParameterList) psiElement.getContext(); - if (!(parameterList instanceof ParameterList)) { + if (!(psiElement.getContext() instanceof ParameterList)) { return new PsiReference[0]; } + ParameterList parameterList = (ParameterList) psiElement.getContext(); - MethodReference method = (MethodReference) parameterList.getContext(); - if (!(method instanceof MethodReference)) { + if (!(parameterList.getContext() instanceof MethodReference)) { return new PsiReference[0]; } + MethodReference method = (MethodReference) parameterList.getContext(); if (!ContainerGetHelper.isContainerGetCall(method)) { return new PsiReference[0]; From 8af5517fe9ef3c9615b0ce5d0479e533b6f8fe60 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 13:00:00 +0200 Subject: [PATCH 0019/2872] Build 0.3.0 --- CHANGELOG.md | 3 ++- META-INF/plugin.xml | 2 +- symfony2-plugin.jar | Bin 7906 -> 15048 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f63dbddf7..f70e5308f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ Changelog ========= -### 0.2.2 +### 0.3.0 +* Services id are now clickable (go to class definition), and autocompletable (CTRL+SPACE). * Should support all ContainerInterface::get proxies as long as the id is the first argument (Previously, only direct calls to ContainerInterface::get or Controller::get) diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 458ccd696..0075fff68 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.2.1 + 0.3.0 Adrien Brault (~8qZ*|wV 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 Date: Wed, 10 Apr 2013 14:16:39 +0200 Subject: [PATCH 0020/2872] Fix missing return --- .../idea/symfony2plugin/Symfony2ProjectComponent.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java index 76fabb12c..5a547d9c5 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java @@ -61,6 +61,8 @@ public ServiceMap getServicesMap() { ServiceMapParser serviceMapParser = new ServiceMapParser(); servicesMap = serviceMapParser.parse(xmlFile); servicesMapLastModified = xmlFileLastModified; + + return servicesMap; } catch (SAXException ignored) { } catch (IOException ignored) { } catch (ParserConfigurationException ignored) { From 4bc8b7bf2f1af19332560a79463f73fa5de0e96d Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 14:24:44 +0200 Subject: [PATCH 0021/2872] Build 0.3.1 --- CHANGELOG.md | 4 ++++ META-INF/plugin.xml | 2 +- symfony2-plugin.jar | Bin 15048 -> 15057 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70e5308f..851e1a337 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========= +### 0.3.1 + +* Fix small cache issue + ### 0.3.0 * Services id are now clickable (go to class definition), and autocompletable (CTRL+SPACE). diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 0075fff68..5c4e9366c 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.3.0 + 0.3.1 Adrien Brault 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 CSPg&x From deb706f02860b23103ec8ddcab44383544a94c94 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 14:52:48 +0200 Subject: [PATCH 0022/2872] Services id completion popup also show the class on the right --- .../symfony2plugin/ServiceLookupElement.java | 32 +++++++++++++++++++ .../idea/symfony2plugin/ServiceMap.java | 5 +-- .../idea/symfony2plugin/ServiceReference.java | 21 +++++++++--- 3 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java new file mode 100644 index 000000000..77f2e94ea --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java @@ -0,0 +1,32 @@ +package fr.adrienbrault.idea.symfony2plugin; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import org.jetbrains.annotations.NotNull; + +/** + * @author Adrien Brault + */ +public class ServiceLookupElement extends LookupElement { + + private String serviceId; + private PhpClass serviceClass; + + public ServiceLookupElement(String serviceId, PhpClass serviceClass) { + this.serviceId = serviceId; + this.serviceClass = serviceClass; + } + + @NotNull + @Override + public String getLookupString() { + return serviceId; + } + + public void renderElement(LookupElementPresentation presentation) { + presentation.setItemText(getLookupString()); + presentation.setTypeText(serviceClass.getPresentableFQN()); + presentation.setTypeGrayed(true); + } +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java index a34f7e5c2..4a3922969 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java @@ -1,5 +1,6 @@ package fr.adrienbrault.idea.symfony2plugin; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -12,8 +13,8 @@ public class ServiceMap { private Map publicMap; public ServiceMap(Map map, Map publicMap) { - this.map = map; - this.publicMap = publicMap; + this.map = Collections.unmodifiableMap(map); + this.publicMap = Collections.unmodifiableMap(publicMap); } public ServiceMap() { diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java index 1ae45a474..8686209a6 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java @@ -18,10 +18,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author Adrien Brault @@ -77,7 +74,21 @@ public PsiElement resolve() { @Override public Object[] getVariants() { Symfony2ProjectComponent symfony2ProjectComponent = getElement().getProject().getComponent(Symfony2ProjectComponent.class); + ServiceMap serviceMap = symfony2ProjectComponent.getServicesMap(); + PhpIndex phpIndex = PhpIndex.getInstance(getElement().getProject()); + + List results = new ArrayList(); + Iterator it = serviceMap.getPublicMap().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry)it.next(); + String serviceId = (String)pairs.getKey(); + String serviceClass = (String)pairs.getValue(); + Collection phpClasses = phpIndex.getClassesByFQN(serviceClass); + if (phpClasses.size() > 0) { + results.add(new ServiceLookupElement(serviceId, phpClasses.iterator().next())); + } + } - return symfony2ProjectComponent.getServicesMap().getPublicMap().keySet().toArray(); + return results.toArray(); } } From b9a6244026b98c4760d0cfd0f530731995a0b95b Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 14:56:27 +0200 Subject: [PATCH 0023/2872] Build 0.3.2 --- CHANGELOG.md | 4 ++++ META-INF/plugin.xml | 2 +- symfony2-plugin.jar | Bin 15057 -> 16425 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 851e1a337..762efa0fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========= +### 0.3.2 + +* Services id completion popup also show the class on the right + ### 0.3.1 * Fix small cache issue diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 5c4e9366c..4055c3ba9 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.3.1 + 0.3.2 Adrien Brault p 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 delta 3485 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 Date: Wed, 10 Apr 2013 15:18:01 +0200 Subject: [PATCH 0024/2872] Build 0.3.3 --- CHANGELOG.md | 4 ++++ META-INF/plugin.xml | 47 ++++++++++++++++++++++++++++++++++++++++---- symfony2-plugin.jar | Bin 16425 -> 16794 bytes 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 762efa0fa..d51c6d858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========= +### 0.3.3 + +* Better description, and integrate the changelog into the plugin + ### 0.3.2 * Services id completion popup also show the class on the right diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 4055c3ba9..ee7f0f0b9 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,18 +1,57 @@ fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.3.2 + 0.3.3 Adrien Brault Symfony2 plugin. - Currently detect ContainerInterface::get() result type. +

Features:

+
    +
  • Autocomplete service id in ContainerInterface::get() calls
  • +
  • Clickable service id in ContainerInterface::get() first argument
  • +
  • Detect ContainerInterface::get() result type and thus provide autocomplete
  • +
]]> 0.3.3 +
    +
  • Better description, and integrate the changelog into the plugin
  • +
- ]]> +

0.3.2

+
    +
  • Services id completion popup also show the class on the right
  • +
+ +

0.3.1

+
    +
  • Fix small cache issue
  • +
+ +

0.3.0

+
    +
  • Services id are now clickable (go to class definition), and autocompletable (CTRL+SPACE).
  • +
  • Should support all ContainerInterface::get proxies as long as the id is the first argument (Previously, only direct calls to ContainerInterface::get or Controller::get)
  • +
+ +

0.2.1

+
    +
  • Fixed required idea build
  • +
+ +

0.2.0

+
    +
  • The `appDevDebugProjectContainer.xml` path can now be configured in the project settings.
  • +
+ +

0.1.0

+
    +
  • Detect ContainerInterface::get result type
  • +
+]]>
diff --git a/symfony2-plugin.jar b/symfony2-plugin.jar index 87dcc0f99c619bd569bcc1abf6e3e6254c8c94b1..2665446aff18cacfcbdc57379cdaa3a006384355 100644 GIT binary patch delta 1034 zcmV+l1oiu=fB~9=0Sr(}0|XQR2mlBG1$wazb~gg>d6R@UCVy64Z`(Qyeb2AZ^3Jol8<6fa+6vhe?hnqG4OWM^y#~T$NnGtM(MIjCyM!I(6ys)TpEDuf zzU5hZT*t1oMa^UdiBt~kNp0tSuYW7vH8|u&j)J{y*>I#=8HN>gHINuss4Cc1YwBfp z;5OjQM}Kf0Vo7bNX_pvc5v{b>gbAyNt<{eRCYZGZ55qr(SG5~OnT?>_@@HZjY%TV; zKyPlXhf(i$|HF|PAQA}`gDB1_Ok8#BO4xGALkj1yUPld!x0jFipDrHOi{;HZJypg- zt-L6S^;#=~@{^SB-l>v2dN z#D5qeJsG`j9N#1fjtMXuHVTk#TL#v`gDikPfy1rIrKJ*FT5_ue+oyM{o5kwpOL`qj zc=6dc8!#95A-pA9buz0YNrqPf-;i#T6U#Ar(zf7gI-7r_vyUI9X-^BD9msI6m2p_n zH@)Svy_%wmX_$T?_|vrCIOwKpO+)_cxPPJy;X&;|cFeUe)+=5q+O7DZ%#TL_1H%KF z<VOuoSp`%Ba~*!LsxPC*CRwYq8t8N1^c`n(n?3h!2#W-N5aq<>-V{wkRW z(TC5{LqiX5tj0Ij=AoAdkzohJvk{Mezt}gOHmdXj@V;OU1=sxQ)a81 zr~?21jR^n%P)h*<6aW+e2mlBG1$wjoIp75j@Og?t2@6>1r~?21jR}+NKQ{(pI{*Lx E0Ephc9VoRCVy1Hj@mE~z4H~`oLa47 zcd1lqQHaU{mAI_XcGb&j4g zj`SP-PNxa$|9|#Lm1{$w;zG`&j+S=3KT98^nXV$z7|iaSt7nXjv=t^w7j1w%wGmI? zTc(qaAP1WnQ9DnW+`TPVi`T_ln<8XT-5rWfLVVd61Io!0$-zP9$WklEg#xot4otx_ zn9WLXU%nCp7Dqw3J%E{;(ua0|o& zkT8!-t3o!QGN1==I2WNTRp3}IY%TeTZC2~WYW;^jHA3e1&rP)hbN}MoTTRRid1oxr+Za#IGj-qd$u(P4( zTU6t%vZ?p-ykzL0-}El^e_?Mrt#sZ(|_%1pPtIiWwkY1dkwm9P&|5_V0ve;S7eHl6$fP)i30UI9x(Hv#|vZv_AV wP)h*<6aW+e2mlBGsdlq(JKzNln|6vqUI9x(Hv#|vZv~TGK{p2QIRF3v0KLR6>Hq)$ From 891bdeff484630e015fdd26ea01c506da79303c8 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 15:27:40 +0200 Subject: [PATCH 0025/2872] Create a dic subpackage --- META-INF/plugin.xml | 4 ++-- .../symfony2plugin/Symfony2ProjectComponent.java | 4 ++-- .../{ => dic}/ContainerGetHelper.java | 2 +- .../{ => dic}/ServiceLookupElement.java | 2 +- .../idea/symfony2plugin/{ => dic}/ServiceMap.java | 2 +- .../symfony2plugin/{ => dic}/ServiceMapParser.java | 2 +- .../symfony2plugin/{ => dic}/ServiceReference.java | 13 ++----------- .../{ => dic}/ServiceReferenceContributor.java | 3 +-- .../{ => dic}/SymfonyContainerTypeProvider.java | 7 ++----- .../tests/{ => dic}/ServiceMapParserTest.java | 7 +++---- 10 files changed, 16 insertions(+), 30 deletions(-) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ContainerGetHelper.java (98%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ServiceLookupElement.java (94%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ServiceMap.java (93%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ServiceMapParser.java (97%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ServiceReference.java (85%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/ServiceReferenceContributor.java (94%) rename src/fr/adrienbrault/idea/symfony2plugin/{ => dic}/SymfonyContainerTypeProvider.java (80%) rename tests/fr/adrienbrault/idea/symfony2plugin/tests/{ => dic}/ServiceMapParserTest.java (90%) diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index ee7f0f0b9..af4fc4189 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -58,8 +58,8 @@ - - + + diff --git a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java index 5a547d9c5..6cc7fd79d 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/Symfony2ProjectComponent.java @@ -2,14 +2,14 @@ import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.project.Project; +import fr.adrienbrault.idea.symfony2plugin.dic.ServiceMap; +import fr.adrienbrault.idea.symfony2plugin.dic.ServiceMapParser; import org.jetbrains.annotations.NotNull; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; /** * @author Adrien Brault diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java similarity index 98% rename from src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java index e7a99d7ef..2ccd51c08 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ContainerGetHelper.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java @@ -1,4 +1,4 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import com.intellij.psi.PsiElement; import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java similarity index 94% rename from src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java index 77f2e94ea..4515d0878 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceLookupElement.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java @@ -1,4 +1,4 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMap.java similarity index 93% rename from src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMap.java index 4a3922969..4891f68c2 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMap.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMap.java @@ -1,4 +1,4 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import java.util.Collections; import java.util.HashMap; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMapParser.java similarity index 97% rename from src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMapParser.java index 1db684d35..adab5c92a 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceMapParser.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceMapParser.java @@ -1,4 +1,4 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import org.w3c.dom.*; import org.xml.sax.SAXException; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReference.java similarity index 85% rename from src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReference.java index 8686209a6..5034bdf8a 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReference.java @@ -1,20 +1,11 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.search.FileTypeIndex; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.indexing.FileBasedIndex; import com.jetbrains.php.PhpIndex; -import com.jetbrains.php.lang.PhpFileType; -import com.jetbrains.php.lang.psi.PhpFile; -import com.jetbrains.php.lang.psi.elements.ClassReference; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java similarity index 94% rename from src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java index 61b16c848..e0b18f968 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/ServiceReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java @@ -1,9 +1,8 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; -import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; diff --git a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java similarity index 80% rename from src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java rename to src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java index 419f14c30..373b61bd6 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java @@ -1,14 +1,11 @@ -package fr.adrienbrault.idea.symfony2plugin; +package fr.adrienbrault.idea.symfony2plugin.dic; import com.intellij.openapi.project.DumbService; import com.intellij.psi.PsiElement; -import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; -import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpReturnInstruction; -import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.MethodReference; -import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.jetbrains.php.lang.psi.resolve.types.PhpType; import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider; +import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import org.jetbrains.annotations.Nullable; /** diff --git a/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java b/tests/fr/adrienbrault/idea/symfony2plugin/tests/dic/ServiceMapParserTest.java similarity index 90% rename from tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java rename to tests/fr/adrienbrault/idea/symfony2plugin/tests/dic/ServiceMapParserTest.java index a2f3eb4a1..18b83ac8c 100644 --- a/tests/fr/adrienbrault/idea/symfony2plugin/tests/ServiceMapParserTest.java +++ b/tests/fr/adrienbrault/idea/symfony2plugin/tests/dic/ServiceMapParserTest.java @@ -1,12 +1,11 @@ -package fr.adrienbrault.idea.symfony2plugin.tests; +package fr.adrienbrault.idea.symfony2plugin.tests.dic; -import fr.adrienbrault.idea.symfony2plugin.ServiceMap; -import fr.adrienbrault.idea.symfony2plugin.ServiceMapParser; +import fr.adrienbrault.idea.symfony2plugin.dic.ServiceMap; +import fr.adrienbrault.idea.symfony2plugin.dic.ServiceMapParser; import org.junit.Test; import org.junit.Assert; import java.io.ByteArrayInputStream; -import java.util.Map; /** * @author Adrien Brault From d558af111be9948c8f097483aa99503a53a4f827 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Wed, 10 Apr 2013 22:53:00 +0200 Subject: [PATCH 0026/2872] Add twig template autocomplete and click to navigate from php --- META-INF/plugin.xml | 1 + ...lper.java => SymfonyInterfacesHelper.java} | 49 +++++--- .../dic/ServiceLookupElement.java | 2 + .../dic/ServiceReferenceContributor.java | 3 +- .../dic/SymfonyContainerTypeProvider.java | 5 +- .../templating/TemplateLookupElement.java | 32 ++++++ .../templating/TemplateReference.java | 106 ++++++++++++++++++ .../TemplateReferenceContributor.java | 45 ++++++++ 8 files changed, 227 insertions(+), 16 deletions(-) rename src/fr/adrienbrault/idea/symfony2plugin/{dic/ContainerGetHelper.java => SymfonyInterfacesHelper.java} (55%) create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index af4fc4189..adedfea9b 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -60,6 +60,7 @@ + diff --git a/src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyInterfacesHelper.java similarity index 55% rename from src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java rename to src/fr/adrienbrault/idea/symfony2plugin/SymfonyInterfacesHelper.java index 2ccd51c08..92bf9d223 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/dic/ContainerGetHelper.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/SymfonyInterfacesHelper.java @@ -1,4 +1,4 @@ -package fr.adrienbrault.idea.symfony2plugin.dic; +package fr.adrienbrault.idea.symfony2plugin; import com.intellij.psi.PsiElement; import com.jetbrains.php.codeInsight.controlFlow.instructions.PhpInstruction; @@ -10,13 +10,31 @@ /** * @author Adrien Brault */ -public class ContainerGetHelper { +public class SymfonyInterfacesHelper { public static boolean isContainerGetCall(PsiElement e) { - return isContainerGetCall(e, 1); + return isCallTo(e, "\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get"); } - public static boolean isContainerGetCall(PsiElement e, int deepness) { + public static boolean isTemplatingRenderCall(PsiElement e) { + return isCallTo(e, new String[] { + "\\Symfony\\Component\\Templating\\EngineInterface.render", + "\\Symfony\\Bridge\\Twig\\TwigEngine.render", + "\\Symfony\\Bundle\\TwigBundle\\TwigEngine.render", + "\\Symfony\\Bundle\\TwigBundle\\TwigEngine.renderResponse", + "\\Symfony\\Bundle\\TwigBundle\\EngineInterface.renderResponse" + }); + } + + private static boolean isCallTo(PsiElement e, String expectedMethodFQN) { + return isCallTo(e, new String[] { expectedMethodFQN }, 1); + } + + private static boolean isCallTo(PsiElement e, String[] expectedMethodFQNs) { + return isCallTo(e, expectedMethodFQNs, 1); + } + + private static boolean isCallTo(PsiElement e, String[] expectedMethodFQNs, int deepness) { if (!(e instanceof MethodReference)) { return false; } @@ -37,9 +55,12 @@ public static boolean isContainerGetCall(PsiElement e, int deepness) { return false; } - String expectedMethodFQN = "\\Symfony\\Component\\DependencyInjection\\ContainerInterface.get"; - if (methodFQN.equals(expectedMethodFQN)) { - return true; + for (int i = 0; i < expectedMethodFQNs.length; i++) { + String expectedMethodFQN = expectedMethodFQNs[i]; + + if (methodFQN.equals(expectedMethodFQN)) { + return true; + } } if (deepness > 3) { @@ -59,7 +80,8 @@ public static boolean isContainerGetCall(PsiElement e, int deepness) { if (null != returnInstructionElement && null != returnInstructionElement.getReference() && returnInstructionElement.getReference().resolve() != resolvedReference) { // Avoid stackoverflow with method calling itself - return isContainerGetCall(returnInstructionElement, deepness + 1); + + return isCallTo(returnInstructionElement, expectedMethodFQNs, deepness + 1); } } } @@ -67,16 +89,17 @@ public static boolean isContainerGetCall(PsiElement e, int deepness) { return false; } - public static String getServiceId(MethodReference e) { - String serviceId = null; + public static String getFirstArgumentStringValue(MethodReference e) { + String stringValue = null; PsiElement[] parameters = e.getParameters(); if (parameters.length > 0 && parameters[0] instanceof StringLiteralExpression) { - serviceId = parameters[0].getText(); // quoted string - serviceId = serviceId.substring(1, serviceId.length() - 1); + StringLiteralExpression stringLiteralExpression = (StringLiteralExpression)parameters[0]; + stringValue = stringLiteralExpression.getText(); // quoted string + stringValue = stringValue.substring(stringLiteralExpression.getValueRange().getStartOffset(), stringLiteralExpression.getValueRange().getEndOffset()); } - return serviceId; + return stringValue; } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java index 4515d0878..01847421b 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceLookupElement.java @@ -2,6 +2,7 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.jetbrains.php.PhpIcons; import com.jetbrains.php.lang.psi.elements.PhpClass; import org.jetbrains.annotations.NotNull; @@ -28,5 +29,6 @@ public void renderElement(LookupElementPresentation presentation) { presentation.setItemText(getLookupString()); presentation.setTypeText(serviceClass.getPresentableFQN()); presentation.setTypeGrayed(true); + presentation.setIcon(PhpIcons.CLASS_ICON); } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java index e0b18f968..e672cb8c2 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java @@ -6,6 +6,7 @@ import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import fr.adrienbrault.idea.symfony2plugin.SymfonyInterfacesHelper; import org.jetbrains.annotations.NotNull; /** @@ -29,7 +30,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No } MethodReference method = (MethodReference) parameterList.getContext(); - if (!ContainerGetHelper.isContainerGetCall(method)) { + if (!SymfonyInterfacesHelper.isContainerGetCall(method)) { return new PsiReference[0]; } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java index 373b61bd6..4913c78c7 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/SymfonyContainerTypeProvider.java @@ -6,6 +6,7 @@ import com.jetbrains.php.lang.psi.resolve.types.PhpType; import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; +import fr.adrienbrault.idea.symfony2plugin.SymfonyInterfacesHelper; import org.jetbrains.annotations.Nullable; /** @@ -20,11 +21,11 @@ public PhpType getType(PsiElement e) { return null; } - if (!ContainerGetHelper.isContainerGetCall(e)) { + if (!SymfonyInterfacesHelper.isContainerGetCall(e)) { return null; } - String serviceId = ContainerGetHelper.getServiceId((MethodReference) e); + String serviceId = SymfonyInterfacesHelper.getFirstArgumentStringValue((MethodReference) e); if (null == serviceId) { return null; } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java new file mode 100644 index 000000000..3e835ea99 --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java @@ -0,0 +1,32 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.jetbrains.twig.TwigFile; +import org.jetbrains.annotations.NotNull; + +/** + * @author Adrien Brault + */ +public class TemplateLookupElement extends LookupElement { + + private String templateName; + private TwigFile twigFile; + + public TemplateLookupElement(String templateName, TwigFile twigFile) { + this.templateName = templateName; + this.twigFile = twigFile; + } + + @NotNull + @Override + public String getLookupString() { + return templateName; + } + + public void renderElement(LookupElementPresentation presentation) { + presentation.setItemText(getLookupString()); + presentation.setIcon(icons.PhpIcons.TwigFileIcon); + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java new file mode 100644 index 000000000..6f989dd88 --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java @@ -0,0 +1,106 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.indexing.FileBasedIndex; +import com.jetbrains.php.PhpIndex; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import com.jetbrains.twig.TwigFile; +import com.jetbrains.twig.TwigFileType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * @author Adrien Brault + */ +public class TemplateReference extends PsiReferenceBase implements PsiReference { + + private String templateName; + + public TemplateReference(@NotNull StringLiteralExpression element) { + super(element); + + templateName = element.getText().substring( + element.getValueRange().getStartOffset(), + element.getValueRange().getEndOffset() + ); // Remove quotes + } + + @Nullable + @Override + public PsiElement resolve() { + Map twigFilesByName = getTwigFilesByName(); + + return twigFilesByName.get(templateName); + } + + @NotNull + @Override + public Object[] getVariants() { + List results = new ArrayList(); + + Map twigFilesByName = getTwigFilesByName(); + for (Map.Entry entry : twigFilesByName.entrySet()) { + results.add( + new TemplateLookupElement(entry.getKey(), entry.getValue()) + ); + } + + return results.toArray(); + } + + private Map getTwigFilesByName() { + PhpIndex phpIndex = PhpIndex.getInstance(getElement().getProject()); + FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + Collection phpClasses = phpIndex.getAllSubclasses("\\Symfony\\Component\\HttpKernel\\Bundle\\Bundle"); + + Map bundlesDirectories = new HashMap(); + for (PhpClass phpClass : phpClasses) { + bundlesDirectories.put(phpClass.getName(), phpClass.getContainingFile().getContainingDirectory()); + } + + Collection twigVirtualFiles = fileBasedIndex.getContainingFiles(FileTypeIndex.NAME, TwigFileType.INSTANCE, GlobalSearchScope.projectScope(getElement().getProject())); + Map results = new HashMap(); + for (VirtualFile twigVirtualFile : twigVirtualFiles) { + // Find in which bundle it is + for (Map.Entry pair : bundlesDirectories.entrySet()) { + if (!VfsUtil.isAncestor((pair.getValue()).getVirtualFile(), twigVirtualFile, false)) { + continue; + } + + String bundleName = pair.getKey(); // XXX:xxx:xxx + String templatePath = VfsUtil.getRelativePath(twigVirtualFile, (pair.getValue()).getVirtualFile(), '/'); // Resources/views/xxx.twig + if (null == templatePath || !templatePath.startsWith("Resources/views")) { + continue; + } + + templatePath = templatePath.substring("Resources/views/".length()); // xxx.twig + String templateDirectory = null; // xxx:XXX:xxx + String templateFile = null; // xxx:xxx:XXX + if (templatePath.contains("/")) { + int lastDirectorySeparatorIndex = templatePath.lastIndexOf("/"); + templateDirectory = templatePath.substring(0, lastDirectorySeparatorIndex); + templateFile = templatePath.substring(lastDirectorySeparatorIndex + 1); + } else { + templateDirectory = ""; + templateFile = templatePath; + } + + String templateFinalName = bundleName + ":" + templateDirectory + ":" + templateFile; + TwigFile twigFile = (TwigFile)PsiManager.getInstance(getElement().getProject()).findFile(twigVirtualFile); + + results.put(templateFinalName, twigFile); + } + } + + return results; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java new file mode 100644 index 000000000..da38d733a --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java @@ -0,0 +1,45 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.psi.elements.MethodReference; +import com.jetbrains.php.lang.psi.elements.ParameterList; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import fr.adrienbrault.idea.symfony2plugin.SymfonyInterfacesHelper; +import org.jetbrains.annotations.NotNull; + +/** + * @author Adrien Brault + */ +public class TemplateReferenceContributor extends PsiReferenceContributor { + + @Override + public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { + psiReferenceRegistrar.registerReferenceProvider( + PlatformPatterns.psiElement(StringLiteralExpression.class), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { + if (!(psiElement.getContext() instanceof ParameterList)) { + return new PsiReference[0]; + } + ParameterList parameterList = (ParameterList) psiElement.getContext(); + + if (!(parameterList.getContext() instanceof MethodReference)) { + return new PsiReference[0]; + } + MethodReference method = (MethodReference) parameterList.getContext(); + + if (!SymfonyInterfacesHelper.isTemplatingRenderCall(method)) { + return new PsiReference[0]; + } + + return new PsiReference[]{ new TemplateReference((StringLiteralExpression) psiElement) }; + } + } + ); + } + +} From cdf2c00ef5c908eb116c176924cb763af4adac88 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Thu, 11 Apr 2013 00:21:48 +0200 Subject: [PATCH 0027/2872] Add twig template autocomplete in twig template --- META-INF/plugin.xml | 4 +- .../dic/ServiceReferenceContributor.java | 38 +++++----- ...a => PhpTemplateReferenceContributor.java} | 5 +- .../templating/TemplateHelper.java | 72 +++++++++++++++++++ .../templating/TemplateLookupElement.java | 3 + .../templating/TemplateReference.java | 59 +-------------- .../templating/TwigCompletionContributor.java | 38 ++++++++++ .../TwigTemplateReferenceContributor.java | 33 +++++++++ 8 files changed, 175 insertions(+), 77 deletions(-) rename src/fr/adrienbrault/idea/symfony2plugin/templating/{TemplateReferenceContributor.java => PhpTemplateReferenceContributor.java} (91%) create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateHelper.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TwigCompletionContributor.java create mode 100644 src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateReferenceContributor.java diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index adedfea9b..3f9353ef3 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -60,7 +60,9 @@ - + + + diff --git a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java index e672cb8c2..134fe6a2a 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/dic/ServiceReferenceContributor.java @@ -3,6 +3,7 @@ import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.PhpLanguage; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; @@ -16,26 +17,29 @@ public class ServiceReferenceContributor extends PsiReferenceContributor { @Override public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { - psiReferenceRegistrar.registerReferenceProvider(PlatformPatterns.psiElement(StringLiteralExpression.class), new PsiReferenceProvider() { - @NotNull - @Override - public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { - if (!(psiElement.getContext() instanceof ParameterList)) { - return new PsiReference[0]; - } - ParameterList parameterList = (ParameterList) psiElement.getContext(); + psiReferenceRegistrar.registerReferenceProvider( + PlatformPatterns.psiElement(StringLiteralExpression.class).withLanguage(PhpLanguage.INSTANCE), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { + if (!(psiElement.getContext() instanceof ParameterList)) { + return new PsiReference[0]; + } + ParameterList parameterList = (ParameterList) psiElement.getContext(); - if (!(parameterList.getContext() instanceof MethodReference)) { - return new PsiReference[0]; - } - MethodReference method = (MethodReference) parameterList.getContext(); + if (!(parameterList.getContext() instanceof MethodReference)) { + return new PsiReference[0]; + } + MethodReference method = (MethodReference) parameterList.getContext(); - if (!SymfonyInterfacesHelper.isContainerGetCall(method)) { - return new PsiReference[0]; - } + if (!SymfonyInterfacesHelper.isContainerGetCall(method)) { + return new PsiReference[0]; + } - return new PsiReference[]{ new ServiceReference((StringLiteralExpression) psiElement) }; + return new PsiReference[]{ new ServiceReference((StringLiteralExpression) psiElement) }; + } } - }); + ); } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/PhpTemplateReferenceContributor.java similarity index 91% rename from src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java rename to src/fr/adrienbrault/idea/symfony2plugin/templating/PhpTemplateReferenceContributor.java index da38d733a..70d9c31fc 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReferenceContributor.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/PhpTemplateReferenceContributor.java @@ -3,6 +3,7 @@ import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.PhpLanguage; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; @@ -12,12 +13,12 @@ /** * @author Adrien Brault */ -public class TemplateReferenceContributor extends PsiReferenceContributor { +public class PhpTemplateReferenceContributor extends PsiReferenceContributor { @Override public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { psiReferenceRegistrar.registerReferenceProvider( - PlatformPatterns.psiElement(StringLiteralExpression.class), + PlatformPatterns.psiElement(StringLiteralExpression.class).withLanguage(PhpLanguage.INSTANCE), new PsiReferenceProvider() { @NotNull @Override diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateHelper.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateHelper.java new file mode 100644 index 000000000..6b1a2e71e --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateHelper.java @@ -0,0 +1,72 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.indexing.FileBasedIndex; +import com.jetbrains.php.PhpIndex; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.jetbrains.twig.TwigFile; +import com.jetbrains.twig.TwigFileType; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class TemplateHelper { + + public static Map getTwigFilesByName(Project project) { + PhpIndex phpIndex = PhpIndex.getInstance(project); + FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + Collection phpClasses = phpIndex.getAllSubclasses("\\Symfony\\Component\\HttpKernel\\Bundle\\Bundle"); + + Map bundlesDirectories = new HashMap(); + for (PhpClass phpClass : phpClasses) { + bundlesDirectories.put(phpClass.getName(), phpClass.getContainingFile().getContainingDirectory()); + } + + Collection twigVirtualFiles = fileBasedIndex.getContainingFiles(FileTypeIndex.NAME, TwigFileType.INSTANCE, GlobalSearchScope.projectScope(project)); + Map results = new HashMap(); + for (VirtualFile twigVirtualFile : twigVirtualFiles) { + // Find in which bundle it is + for (Map.Entry pair : bundlesDirectories.entrySet()) { + if (!VfsUtil.isAncestor((pair.getValue()).getVirtualFile(), twigVirtualFile, false)) { + continue; + } + + String bundleName = pair.getKey(); // XXX:xxx:xxx + String templatePath = VfsUtil.getRelativePath(twigVirtualFile, (pair.getValue()).getVirtualFile(), '/'); // Resources/views/xxx.twig + if (null == templatePath || !templatePath.startsWith("Resources/views")) { + continue; + } + + templatePath = templatePath.substring("Resources/views/".length()); // xxx.twig + String templateDirectory = null; // xxx:XXX:xxx + String templateFile = null; // xxx:xxx:XXX + if (templatePath.contains("/")) { + int lastDirectorySeparatorIndex = templatePath.lastIndexOf("/"); + templateDirectory = templatePath.substring(0, lastDirectorySeparatorIndex); + templateFile = templatePath.substring(lastDirectorySeparatorIndex + 1); + } else { + templateDirectory = ""; + templateFile = templatePath; + } + + String templateFinalName = bundleName + ":" + templateDirectory + ":" + templateFile; + TwigFile twigFile = (TwigFile) PsiManager.getInstance(project).findFile(twigVirtualFile); + + results.put(templateFinalName, twigFile); + } + } + + return results; + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java index 3e835ea99..f9c1282be 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateLookupElement.java @@ -2,6 +2,7 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; +import com.intellij.openapi.vfs.VfsUtil; import com.jetbrains.twig.TwigFile; import org.jetbrains.annotations.NotNull; @@ -27,6 +28,8 @@ public String getLookupString() { public void renderElement(LookupElementPresentation presentation) { presentation.setItemText(getLookupString()); presentation.setIcon(icons.PhpIcons.TwigFileIcon); + presentation.setTypeText(VfsUtil.getRelativePath(twigFile.getContainingDirectory().getVirtualFile(), twigFile.getProject().getBaseDir(), '/')); + presentation.setTypeGrayed(true); } } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java index 6f989dd88..b6139add5 100644 --- a/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TemplateReference.java @@ -1,17 +1,9 @@ package fr.adrienbrault.idea.symfony2plugin.templating; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.search.FileTypeIndex; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.util.indexing.FileBasedIndex; -import com.jetbrains.php.PhpIndex; -import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.jetbrains.twig.TwigFile; -import com.jetbrains.twig.TwigFileType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,7 +28,7 @@ public TemplateReference(@NotNull StringLiteralExpression element) { @Nullable @Override public PsiElement resolve() { - Map twigFilesByName = getTwigFilesByName(); + Map twigFilesByName = TemplateHelper.getTwigFilesByName(getElement().getProject()); return twigFilesByName.get(templateName); } @@ -46,7 +38,7 @@ public PsiElement resolve() { public Object[] getVariants() { List results = new ArrayList(); - Map twigFilesByName = getTwigFilesByName(); + Map twigFilesByName = TemplateHelper.getTwigFilesByName(getElement().getProject()); for (Map.Entry entry : twigFilesByName.entrySet()) { results.add( new TemplateLookupElement(entry.getKey(), entry.getValue()) @@ -56,51 +48,4 @@ public Object[] getVariants() { return results.toArray(); } - private Map getTwigFilesByName() { - PhpIndex phpIndex = PhpIndex.getInstance(getElement().getProject()); - FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); - Collection phpClasses = phpIndex.getAllSubclasses("\\Symfony\\Component\\HttpKernel\\Bundle\\Bundle"); - - Map bundlesDirectories = new HashMap(); - for (PhpClass phpClass : phpClasses) { - bundlesDirectories.put(phpClass.getName(), phpClass.getContainingFile().getContainingDirectory()); - } - - Collection twigVirtualFiles = fileBasedIndex.getContainingFiles(FileTypeIndex.NAME, TwigFileType.INSTANCE, GlobalSearchScope.projectScope(getElement().getProject())); - Map results = new HashMap(); - for (VirtualFile twigVirtualFile : twigVirtualFiles) { - // Find in which bundle it is - for (Map.Entry pair : bundlesDirectories.entrySet()) { - if (!VfsUtil.isAncestor((pair.getValue()).getVirtualFile(), twigVirtualFile, false)) { - continue; - } - - String bundleName = pair.getKey(); // XXX:xxx:xxx - String templatePath = VfsUtil.getRelativePath(twigVirtualFile, (pair.getValue()).getVirtualFile(), '/'); // Resources/views/xxx.twig - if (null == templatePath || !templatePath.startsWith("Resources/views")) { - continue; - } - - templatePath = templatePath.substring("Resources/views/".length()); // xxx.twig - String templateDirectory = null; // xxx:XXX:xxx - String templateFile = null; // xxx:xxx:XXX - if (templatePath.contains("/")) { - int lastDirectorySeparatorIndex = templatePath.lastIndexOf("/"); - templateDirectory = templatePath.substring(0, lastDirectorySeparatorIndex); - templateFile = templatePath.substring(lastDirectorySeparatorIndex + 1); - } else { - templateDirectory = ""; - templateFile = templatePath; - } - - String templateFinalName = bundleName + ":" + templateDirectory + ":" + templateFile; - TwigFile twigFile = (TwigFile)PsiManager.getInstance(getElement().getProject()).findFile(twigVirtualFile); - - results.put(templateFinalName, twigFile); - } - } - - return results; - } - } diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigCompletionContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigCompletionContributor.java new file mode 100644 index 000000000..8671fdead --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigCompletionContributor.java @@ -0,0 +1,38 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.codeInsight.completion.*; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.util.ProcessingContext; +import com.jetbrains.twig.TwigFile; +import com.jetbrains.twig.TwigLanguage; +import com.jetbrains.twig.TwigTagWithFileReference; +import com.jetbrains.twig.TwigTokenTypes; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +/** + * @author Adrien Brault + */ +public class TwigCompletionContributor extends CompletionContributor { + + public TwigCompletionContributor() { + extend( + CompletionType.BASIC, + PlatformPatterns.psiElement(TwigTokenTypes.STRING_TEXT).withParent(TwigTagWithFileReference.class).withLanguage(TwigLanguage.INSTANCE), + new CompletionProvider() { + public void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + Map twigFilesByName = TemplateHelper.getTwigFilesByName(parameters.getPosition().getProject()); + for (Map.Entry entry : twigFilesByName.entrySet()) { + resultSet.addElement( + new TemplateLookupElement(entry.getKey(), entry.getValue()) + ); + } + } + } + ); + } + +} diff --git a/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateReferenceContributor.java b/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateReferenceContributor.java new file mode 100644 index 000000000..2d0eb31fc --- /dev/null +++ b/src/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateReferenceContributor.java @@ -0,0 +1,33 @@ +package fr.adrienbrault.idea.symfony2plugin.templating; + +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; +import com.jetbrains.twig.TwigLanguage; +import com.jetbrains.twig.TwigTagWithFileReference; +import com.jetbrains.twig.TwigTokenTypes; +import org.jetbrains.annotations.NotNull; + +/** + * @author Adrien Brault + * + * TODO This does not seem to be used by phpstorm ... using the completion contributor as a fallback for now + */ +public class TwigTemplateReferenceContributor extends PsiReferenceContributor { + + @Override + public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { + psiReferenceRegistrar.registerReferenceProvider( + PlatformPatterns.psiElement(TwigTokenTypes.STRING_TEXT).withParent(TwigTagWithFileReference.class).withLanguage(TwigLanguage.INSTANCE), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { + return new PsiReference[]{ new TemplateReference((StringLiteralExpression) psiElement) }; + } + } + ); + } + +} From d1518e34d237227a740749d7659831968d7ce95d Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Thu, 11 Apr 2013 00:32:58 +0200 Subject: [PATCH 0028/2872] Build 0.4.0 --- CHANGELOG.md | 6 ++++++ META-INF/plugin.xml | 14 ++++++++++++-- symfony2-plugin.jar | Bin 16794 -> 30129 bytes 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d51c6d858..9e0518749 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========= +### 0.4.0 + +* Autocomplete template name in render() calls +* Clickable template name in render() calls +* Autocomplete template name in twig templates + ### 0.3.3 * Better description, and integrate the changelog into the plugin diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index 3f9353ef3..13c69e9e1 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,7 +1,7 @@ - + fr.adrienbrault.idea.symfony2plugin Symfony2 Plugin - 0.3.3 + 0.4.0 Adrien Brault Autocomplete service id in ContainerInterface::get() calls
  • Clickable service id in ContainerInterface::get() first argument
  • Detect ContainerInterface::get() result type and thus provide autocomplete
  • +
  • Autocomplete template name in render() calls
  • +
  • Clickable template name in render() calls
  • +
  • Autocomplete template name in twig templates
  • ]]>
    0.4.0 +
      +
    • Autocomplete template name in render() calls
    • +
    • Clickable template name in render() calls
    • +
    • Autocomplete template name in twig templates
    • +
    +

    0.3.3