This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.
Build: NetBeans IDE Dev (Build 20120524-b518f5ed225c) VM: Java HotSpot(TM) Client VM, 23.0-b21, Java(TM) SE Runtime Environment, 1.7.0_04-b20 OS: Linux User Comments: jglick: Trying to write and debug a Jackpot hint. Stacktrace: java.lang.ClassCastException: com.sun.tools.javac.tree.JCTree$JCMethodInvocation cannot be cast to com.sun.source.tree.BlockTree at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.rewriteChildren(ImmutableTreeTranslator.java:591) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitMethod(ImmutableTreeTranslator.java:352) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitMethod(ImmutableTreeTranslator.java:94) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:695) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:136) at org.netbeans.api.java.source.TreeUtilities$1.translate(TreeUtilities.java:962)
Created attachment 119893 [details] stacktrace
Created attachment 119894 [details] stacktrace
I have the following basic hints: org.openide.util.Lookup.getDefault().lookup(org.netbeans.api.javahelp.Help.class).showHelp($c) :: $c instanceof org.openide.util.HelpCtx => $c.display() ;; org.openide.util.Lookup.getDefault().lookup(org.netbeans.api.javahelp.Help.class).showHelp($c, true) :: $c instanceof org.openide.util.HelpCtx => $c.display() ;; which pass their test: %%TestCase no-null-check package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("id")); } } %%=> package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { new HelpCtx("id").display(); } } %%TestCase no-null-check-pass-true package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("id"), true); } } %%=> package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { new HelpCtx("id").display(); } } (The *.hint does show errors saying "package org.openide.util does not exist", which is bogus since that is in the classpath of the javahelp module, but this seems to be nonfatal.) But if I try to add a hint for a variant with a null check (e.g. for RemoteHelpAction.java): org.netbeans.api.javahelp.Help $h = org.openide.util.Lookup.getDefault().lookup(org.netbeans.api.javahelp.Help.class); if ($h != null) { $h.showHelp($c); } :: $c instanceof org.openide.util.HelpCtx => $c.display() ;; org.netbeans.api.javahelp.Help $h = org.openide.util.Lookup.getDefault().lookup(org.netbeans.api.javahelp.Help.class); if ($h != null) { $h.showHelp($c, true); } :: $c instanceof org.openide.util.HelpCtx => $c.display() ;; and matching tests: %%TestCase null-check package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { Help help = Lookup.getDefault().lookup(Help.class); if (help != null) { help.showHelp(new HelpCtx("id")); } } } %%=> package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { new HelpCtx("id").display(); } } %%TestCase null-check-pass-true package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { Help help = Lookup.getDefault().lookup(Help.class); if (help != null) { help.showHelp(new HelpCtx("id"), true); } } } %%=> package test; import org.netbeans.api.javahelp.Help; import org.openide.util.HelpCtx; import org.openide.util.Lookup; public class Test { void m() { new HelpCtx("id").display(); } } then I get this exception just by displaying the Help.test tab, and a similar exception when trying to apply the hint in an actual file (it is correctly offered so the pattern matching is working).
Adding a semicolon to the end of the rewrite pattern seems to solve the CCE. (Bogus warning about Lookup remains.)
Created attachment 121608 [details] MinimalSample_BlockSelectionWhichResultsInError The exception can be produced much easier than to use jackpot-rules. See the attached screenshot with a minimal sample - MinimalSample_BlockSelectionWhichResultsInError: # Mark the innerblock of a method # then try to extract a method from it # then the exception will be thrown java.lang.ClassCastException: com.sun.tools.javac.tree.JCTree$JCExpressionStatement cannot be cast to com.sun.source.tree.BlockTree at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.rewriteChildren(ImmutableTreeTranslator.java:589) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitMethod(ImmutableTreeTranslator.java:350) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitMethod(ImmutableTreeTranslator.java:92) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:695) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:134) at org.netbeans.api.java.source.TreeUtilities$1.translate(TreeUtilities.java:959) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:208) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.rewriteChildren(ImmutableTreeTranslator.java:560) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitClass(ImmutableTreeTranslator.java:342) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitClass(ImmutableTreeTranslator.java:92) at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:622) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:134) at org.netbeans.api.java.source.TreeUtilities$1.translate(TreeUtilities.java:959) at org.netbeans.api.java.source.TreeUtilities$1.translate(TreeUtilities.java:957) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:208) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.rewriteChildren(ImmutableTreeTranslator.java:521) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitCompilationUnit(ImmutableTreeTranslator.java:332) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.visitCompilationUnit(ImmutableTreeTranslator.java:92) at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:490) at org.netbeans.modules.java.source.transform.ImmutableTreeTranslator.translate(ImmutableTreeTranslator.java:134) at org.netbeans.api.java.source.TreeUtilities$1.translate(TreeUtilities.java:959) at org.netbeans.api.java.source.TreeUtilities.translate(TreeUtilities.java:968) at org.netbeans.api.java.source.WorkingCopy.processCurrentCompilationUnit(WorkingCopy.java:551) at org.netbeans.api.java.source.WorkingCopy.getChanges(WorkingCopy.java:730) at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:647) at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:634) at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:488) at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:583) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:150) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:134) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:200) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:197) at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:168) at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:360) at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:72) at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:197) at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:102) at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:438) at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:409) at org.netbeans.api.java.source.JavaSource.runModificationTask(JavaSource.java:655) at org.netbeans.modules.java.hints.introduce.IntroduceHint$IntroduceMethodFix.implement(IntroduceHint.java:1924) [catch] at org.netbeans.modules.java.hints.introduce.IntroduceAction.doPerformAction(IntroduceAction.java:225) at org.netbeans.modules.java.hints.introduce.IntroduceAction.perform(IntroduceAction.java:114) at org.netbeans.modules.java.hints.infrastructure.HintAction.doPerform(HintAction.java:115) at org.netbeans.modules.java.hints.infrastructure.HintAction.actionPerformed(HintAction.java:88) at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1639) at javax.swing.JComponent.processKeyBinding(JComponent.java:2851) at javax.swing.JComponent.processKeyBindings(JComponent.java:2886) at javax.swing.JComponent.processKeyEvent(JComponent.java:2814) at java.awt.Component.processEvent(Component.java:6067) at java.awt.Container.processEvent(Container.java:2039) at java.awt.Component.dispatchEventImpl(Component.java:4653) at java.awt.Container.dispatchEventImpl(Container.java:2097) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712) at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990) at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855) at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676) at java.awt.Component.dispatchEventImpl(Component.java:4525) at java.awt.Container.dispatchEventImpl(Container.java:2097) at java.awt.Window.dispatchEventImpl(Window.java:2482) at java.awt.Component.dispatchEvent(Component.java:4481) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648) at java.awt.EventQueue.access$000(EventQueue.java:84) at java.awt.EventQueue$1.run(EventQueue.java:607) at java.awt.EventQueue$1.run(EventQueue.java:605) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:621) at java.awt.EventQueue$2.run(EventQueue.java:619) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:618) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:158) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
http://hg.netbeans.org/jet-main/rev/2b5a5ae411e6
Integrated into 'main-golden', will be available in build *201306050626* on http://bits.netbeans.org/dev/nightly/ (upload may still be in progress) Changeset: http://hg.netbeans.org/main-golden/rev/2b5a5ae411e6 User: Jan Lahoda <jlahoda@netbeans.org> Log: #213023: handle introduce method for full method's body.