History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: IDEADEV-30566
Type: New Feature New Feature
Status: Open Open
Priority: Normal Normal
Assignee: Maxim Mossienko
Reporter: Kenton
Votes: 2
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
IDEA: Development

Coldfusion Language Support

Created: 28 Jul 08 00:32   Updated: 11 Nov 08 21:11
Component/s: Code Coverage, IntelliLang
Fix Version/s: None

Original Estimate: Unknown Remaining Estimate: Unknown Time Spent: Unknown
File Attachments: 1. XML File cf8.xml (786 kb)
2. PDF File cf8_beta_cfmlreference_052907.pdf (8.17 Mb)
3. File cfsyntaxexamples.cfml (2 kb)


Build: 0


 Description  « Hide
I think there are a few people who would be interested in this:
http://www.infoaccelerator.net/blog/post.cfm/ide-bliss-or-intellij-kicks-ass#comments

The HTML plugin does a pretty decent job at highlight except it complains about non closed CF tags (like cfelse) tags. If we could have that and someway to map a cf variable to a java class, I'd be so happy. Also note that coldfusion supports JSP tags too!

If something like this was supported (like EL) every user at our company would be using IntelliJ!
<--@cfjavavariable id="user" type="com.company.user.User"-->

Also for reference there is an open source CFEclipse project which already has things like the language dictionary down so perhaps some of their work could be helpful..

Just dreaming here!



 All   Comments   Work Log   Change History      Sort Order:
Maxim Mossienko - 28 Jul 08 17:37
Let's start the discussion with reference to spec of cf tags

Kenton - 28 Jul 08 19:35 - edited
Also I should mention that BlueDragon (CFML engine) had partnered with BEA (before the oracle take over) http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/weblogic/bluedragon/

And JBoss has partnered with Ralio (http://www.jboss.org/railo/) an open source CFML engine.

The Coldfusion language is basically HTML (unfortunately not valid XML). The language is comprised of functions and tags (like JSP).. It is a dynamically typed language. Also it can access the JSP request scope by calling getPageContext()

Attached is the CF8 dictionary (grabbed from: http://www.markdrew.co.uk/blog/index.cfm/2007/6/7/CF8-Syntax-Dictionaries-for-CFEclipse)


Kenton - 28 Jul 08 19:36
CF 8 XML Dictionary file

Maxim Mossienko - 28 Jul 08 20:02
Thank you ! I would not mind from several file examples too

Kenton - 22 Aug 08 01:38
CF8 Reference Document

Kenton - 22 Aug 08 01:54
Various sample coldfusion syntax examples that I created/found to demonstrate a few language features. Includes comments explaining what code does

Kenton - 22 Aug 08 01:55
Please let me know if I can provide anything else to help! People have been wanting a true IDE for coldfusion for years, Perhaps you can do what Adobe hasn't. Thanks!

Kenton - 24 Sep 08 20:31
Maxim, is there anything that myself (a capable Java programmer) can provide to help this task?

I think it definitely needs to be an extension of the HTML4 language plugin, but from what I can see this isn't open source. Something as simple as allowing non attributes inside of tags (like <cfset test=#blah#+1>) and excluding validation of nonclosed coldfusion tags like

<cfif>
<cfelse>
</cfif>

Would be a huge start to making intellij usable for Coldfusion editting. Right now the HTML4 plugin loses its mind because of the invalid cf syntax, and the code style formatter will actually remove code, so I am stuck using eclipse or telling intellij it is a text file.

Please let me know if JetBrains is considering this, thanks for the great product, I just hate leaving it to use <cfshudder>Eclipse </cfshudder>


Maxim Mossienko - 24 Sep 08 20:39
Started plugin development, stay tuned


Kenton - 18 Oct 08 02:17
This is a great start and really goes along way into making intellij usable for coldfusion editing. Thanks for your work on this!

I have been using it most of today and I have run into a few bugs with bracket matching and it seems like the javascript support found in the html editor isn't enabled. Should I report any bugs that I find or is it still in such an early stage development that you are aware of most of the issues?


Maxim Mossienko - 21 Oct 08 14:54
Please, provide more information in what place javascript is not recognized

Kenton - 21 Oct 08 20:13
I don't know if I need to configure something but no autocomplete (html or javascript) works. If I create a test.html and a test.cfm the cfm does not have the tag completion or javascript validation...

I am using the latest EAP (8890)


Kenton - 05 Nov 08 01:37
Loving the latest version! This is going to be fantastic, I added a few live templates that will be helpful to anyone who uses coldfusion

shortcut: cfs
<cfset $VAR$ = $VALUE$/>

shortcut: cfd
<cfdump var="#$VAR$#">

shortcut: cfo
<cfoutput>$CONTENT$</cfoutput>

Thanks!


Kenton - 11 Nov 08 21:06
Is this the best place to continue the conversation on this plugin?

The latest version of the plugin seems to have a bug, on CfmlIcons.java it references a non existent tag icon

http://svn.jetbrains.org/idea/Trunk/CFML/src/com/intellij/coldFusion/CfmlIcons.java

Here is the stack trace

Icon cannot be found in '/ColdFusion_tag_icon.png', aClass='class com.intellij.coldFusion.CfmlIcons'
java.lang.Throwable
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:48)
at com.intellij.openapi.util.IconLoader.getIcon(IconLoader.java:99)
at com.intellij.openapi.util.IconLoader.getIcon(IconLoader.java:78)
at com.intellij.coldFusion.CfmlIcons.<clinit>(CfmlIcons.java:13)
at com.intellij.coldFusion.CfmlFileType.getIcon(CfmlFileType.java:43)
at com.intellij.openapi.vfs.VirtualFile.getIcon(VirtualFile.java:257)
at com.intellij.util.IconUtil.getIcon(IconUtil.java:84)
at com.intellij.psi.impl.ElementBase.getElementIcon(ElementBase.java:67)
at com.intellij.psi.impl.ElementBase.getIcon(ElementBase.java:40)
at com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode.update(AbstractPsiBasedNode.java:23)
at com.intellij.ide.util.treeView.AbstractTreeNode.getUpdatedData(AbstractTreeNode.java:95)
at com.intellij.ide.util.treeView.AbstractTreeNode.update(AbstractTreeNode.java:52)
at com.intellij.ide.util.treeView.AbstractTreeUi.doUpdateNodeDescriptor(AbstractTreeUi.java:1197)
at com.intellij.ide.util.treeView.AbstractTreeBuilder.updateNodeDescriptor(AbstractTreeBuilder.java:294)
at com.intellij.ide.util.treeView.AbstractTreeUi.collectNodesToInsert(AbstractTreeUi.java:821)
at com.intellij.ide.util.treeView.AbstractTreeUi.access$900(AbstractTreeUi.java:41)
at com.intellij.ide.util.treeView.AbstractTreeUi$8.run(AbstractTreeUi.java:553)
at com.intellij.openapi.util.ExecutionCallback.callback(ExecutionCallback.java:48)
at com.intellij.openapi.util.ExecutionCallback.doWhenExecuted(ExecutionCallback.java:32)
at com.intellij.openapi.util.ActionCallback.doWhenDone(ActionCallback.java:53)
at com.intellij.ide.util.treeView.AbstractTreeUi.updateNodeChildren(AbstractTreeUi.java:551)
at com.intellij.ide.util.treeView.AbstractTreeUi.updateSubtree(AbstractTreeUi.java:494)
at com.intellij.ide.util.treeView.AbstractTreeUpdater$2.run(AbstractTreeUpdater.java:154)
at com.intellij.openapi.util.ExecutionCallback.callback(ExecutionCallback.java:48)
at com.intellij.openapi.util.ExecutionCallback.doWhenExecuted(ExecutionCallback.java:32)
at com.intellij.openapi.util.ActionCallback.doWhenDone(ActionCallback.java:53)
at com.intellij.ide.util.treeView.AbstractTreeUpdater.performUpdate(AbstractTreeUpdater.java:152)
at com.intellij.ide.util.treeView.AbstractTreeUi.doExpandNodeChildren(AbstractTreeUi.java:253)
at com.intellij.ide.util.treeView.AbstractTreeBuilder.expandNodeChildren(AbstractTreeBuilder.java:208)
at com.intellij.ide.projectView.BaseProjectTreeBuilder.expandNodeChildren(BaseProjectTreeBuilder.java:18)
at com.intellij.ide.util.treeView.AbstractTreeUi$MyExpansionListener.treeExpanded(AbstractTreeUi.java:1897)
at javax.swing.JTree.fireTreeExpanded(JTree.java:2669)
at javax.swing.JTree.setExpandedState(JTree.java:3430)
at javax.swing.JTree.expandPath(JTree.java:2166)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:319)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:328)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:328)
at com.intellij.ide.util.treeView.TreeState.applyExpanded(TreeState.java:239)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:228)
at com.intellij.ide.projectView.impl.AbstractProjectViewPane.restoreExpandedPaths(AbstractProjectViewPane.java:28)
at com.intellij.ide.projectView.impl.ProjectViewImpl.c(ProjectViewImpl.java:398)
at com.intellij.ide.projectView.impl.ProjectViewImpl.e(ProjectViewImpl.java:34)
at com.intellij.ide.projectView.impl.ProjectViewImpl.changeView(ProjectViewImpl.java:198)
at com.intellij.ide.projectView.impl.ProjectViewImpl.b(ProjectViewImpl.java:338)
at com.intellij.ide.projectView.impl.ProjectViewImpl.b(ProjectViewImpl.java:255)
at com.intellij.ide.projectView.impl.ProjectViewImpl.setupImpl(ProjectViewImpl.java:221)
at com.intellij.ide.projectView.impl.ProjectViewImpl$8$1.run(ProjectViewImpl.java:2)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:27)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at com.intellij.ide.IdeEventQueue.c(IdeEventQueue.java:35)
at com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:99)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:217)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:300)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:210)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:195)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:187)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

java.lang.IllegalStateException: @NotNull method com/intellij/openapi/util/IconLoader.getIcon must not return null
at com.intellij.openapi.util.IconLoader.getIcon(IconLoader.java:101)
at com.intellij.openapi.util.IconLoader.getIcon(IconLoader.java:78)
at com.intellij.coldFusion.CfmlIcons.<clinit>(CfmlIcons.java:13)
at com.intellij.coldFusion.CfmlFileType.getIcon(CfmlFileType.java:43)
at com.intellij.openapi.vfs.VirtualFile.getIcon(VirtualFile.java:257)
at com.intellij.util.IconUtil.getIcon(IconUtil.java:84)
at com.intellij.psi.impl.ElementBase.getElementIcon(ElementBase.java:67)
at com.intellij.psi.impl.ElementBase.getIcon(ElementBase.java:40)
at com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode.update(AbstractPsiBasedNode.java:23)
at com.intellij.ide.util.treeView.AbstractTreeNode.getUpdatedData(AbstractTreeNode.java:95)
at com.intellij.ide.util.treeView.AbstractTreeNode.update(AbstractTreeNode.java:52)
at com.intellij.ide.util.treeView.AbstractTreeUi.doUpdateNodeDescriptor(AbstractTreeUi.java:1197)
at com.intellij.ide.util.treeView.AbstractTreeBuilder.updateNodeDescriptor(AbstractTreeBuilder.java:294)
at com.intellij.ide.util.treeView.AbstractTreeUi.collectNodesToInsert(AbstractTreeUi.java:821)
at com.intellij.ide.util.treeView.AbstractTreeUi.access$900(AbstractTreeUi.java:41)
at com.intellij.ide.util.treeView.AbstractTreeUi$8.run(AbstractTreeUi.java:553)
at com.intellij.openapi.util.ExecutionCallback.callback(ExecutionCallback.java:48)
at com.intellij.openapi.util.ExecutionCallback.doWhenExecuted(ExecutionCallback.java:32)
at com.intellij.openapi.util.ActionCallback.doWhenDone(ActionCallback.java:53)
at com.intellij.ide.util.treeView.AbstractTreeUi.updateNodeChildren(AbstractTreeUi.java:551)
at com.intellij.ide.util.treeView.AbstractTreeUi.updateSubtree(AbstractTreeUi.java:494)
at com.intellij.ide.util.treeView.AbstractTreeUpdater$2.run(AbstractTreeUpdater.java:154)
at com.intellij.openapi.util.ExecutionCallback.callback(ExecutionCallback.java:48)
at com.intellij.openapi.util.ExecutionCallback.doWhenExecuted(ExecutionCallback.java:32)
at com.intellij.openapi.util.ActionCallback.doWhenDone(ActionCallback.java:53)
at com.intellij.ide.util.treeView.AbstractTreeUpdater.performUpdate(AbstractTreeUpdater.java:152)
at com.intellij.ide.util.treeView.AbstractTreeUi.doExpandNodeChildren(AbstractTreeUi.java:253)
at com.intellij.ide.util.treeView.AbstractTreeBuilder.expandNodeChildren(AbstractTreeBuilder.java:208)
at com.intellij.ide.projectView.BaseProjectTreeBuilder.expandNodeChildren(BaseProjectTreeBuilder.java:18)
at com.intellij.ide.util.treeView.AbstractTreeUi$MyExpansionListener.treeExpanded(AbstractTreeUi.java:1897)
at javax.swing.JTree.fireTreeExpanded(JTree.java:2669)
at javax.swing.JTree.setExpandedState(JTree.java:3430)
at javax.swing.JTree.expandPath(JTree.java:2166)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:319)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:328)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:328)
at com.intellij.ide.util.treeView.TreeState.applyExpanded(TreeState.java:239)
at com.intellij.ide.util.treeView.TreeState.applyTo(TreeState.java:228)
at com.intellij.ide.projectView.impl.AbstractProjectViewPane.restoreExpandedPaths(AbstractProjectViewPane.java:28)
at com.intellij.ide.projectView.impl.ProjectViewImpl.c(ProjectViewImpl.java:398)
at com.intellij.ide.projectView.impl.ProjectViewImpl.e(ProjectViewImpl.java:34)
at com.intellij.ide.projectView.impl.ProjectViewImpl.changeView(ProjectViewImpl.java:198)
at com.intellij.ide.projectView.impl.ProjectViewImpl.b(ProjectViewImpl.java:338)
at com.intellij.ide.projectView.impl.ProjectViewImpl.b(ProjectViewImpl.java:255)
at com.intellij.ide.projectView.impl.ProjectViewImpl.setupImpl(ProjectViewImpl.java:221)
at com.intellij.ide.projectView.impl.ProjectViewImpl$8$1.run(ProjectViewImpl.java:2)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:27)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at com.intellij.ide.IdeEventQueue.c(IdeEventQueue.java:35)
at com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:99)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:217)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:300)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:210)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:195)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:187)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


Maxim Mossienko - 11 Nov 08 21:11
Will fix shortly