Convert a PsiElement to FtlMaro

Hi,

I am stuck at the conversion between PsiElement and Ftl specific element.

Here is the code:

PsiElement element = provider.findElementAt(cursorPosition, language); //language is <FreeMarker> and cursor is inside a Macro
PsiElement rootElement = SomeUtils.getRootElement(element);

From debugger, I can tell the rootElement is a FtlMacro but I can't directly cast it to it. I can only cast it to its super class FtlXmlTag.

How can I get the FtlMacro (or other Ftl related element) from the PsiElement?


Many thanks,

Mian Zhang

4 comments
Comment actions Permalink

What do you mean by "can't cast"? What exactly happens when you try?

0
Comment actions Permalink

Hi Dmitry,

Thanks for your responds.

Please see the attached screenshot where I debugged to the point. The next step will throw the following ClassCastException:

java.lang.ClassCastException: com.intellij.freemarker.psi.directives.FtlMacro cannot be cast to com.intellij.freemarker.psi.directives.FtlMacro
 at com.expedia.tools.autoloc.actions.ViewEditAction.handleAction(ViewEditAction.java:35)
 at com.expedia.tools.autoloc.actions.BaseAction.actionPerformed(BaseAction.java:53)
 at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:164)
 at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter$1.run(ActionMenuItem.java:266)
 at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:926)
 at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:124)
 at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:236)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
 at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:105)
 at com.intellij.ui.plaf.beg.BegMenuItemUI.a(BegMenuItemUI.java:512)
 at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:44)
 at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:532)
 at java.awt.Component.processMouseEvent(Component.java:6505)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
 at java.awt.Component.processEvent(Component.java:6270)
 at java.awt.Container.processEvent(Container.java:2229)
 at java.awt.Component.dispatchEventImpl(Component.java:4861)
 at java.awt.Container.dispatchEventImpl(Container.java:2287)
 at java.awt.Component.dispatchEvent(Component.java:4687)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
 at java.awt.Container.dispatchEventImpl(Container.java:2273)
 at java.awt.Window.dispatchEventImpl(Window.java:2719)
 at java.awt.Component.dispatchEvent(Component.java:4687)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
 at java.awt.EventQueue.access$200(EventQueue.java:103)
 at java.awt.EventQueue$3.run(EventQueue.java:694)
 at java.awt.EventQueue$3.run(EventQueue.java:692)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
 at java.awt.EventQueue$4.run(EventQueue.java:708)
 at java.awt.EventQueue$4.run(EventQueue.java:706)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
 at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:697)
 at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:520)
 at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
[



Attachment(s):
image.jpg
0
Comment actions Permalink

You need to add the FreeMarker plugin jars to the classpath of the IntelliJ IDEA SDK, not as a separate library in your module.

0
Comment actions Permalink

Hi Dmitry,

Thanks for pointing out the classpath issue. But just adding it to SDK classpath still not working. After looking around, I found by adding "<depends>com.intellij.freemarker</depends>" into plugin.xml finally solved the problem.

Mian

0

Please sign in to leave a comment.