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.

Bug 213023 - Jackpot: ClassCastException: JCTree$JCMethodInvocation cannot be cast to BlockTree
Summary: Jackpot: ClassCastException: JCTree$JCMethodInvocation cannot be cast to Bloc...
Status: RESOLVED FIXED
Alias: None
Product: java
Classification: Unclassified
Component: Hints (show other bugs)
Version: 7.2
Hardware: All All
: P3 normal with 1 vote (vote)
Assignee: Jan Lahoda
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-05-25 15:18 UTC by Jesse Glick
Modified: 2013-06-05 09:36 UTC (History)
2 users (show)

See Also:
Issue Type: DEFECT
Exception Reporter: 188399


Attachments
stacktrace (3.61 KB, text/plain)
2012-05-25 15:18 UTC, Jesse Glick
Details
stacktrace (2.70 KB, text/plain)
2012-05-25 15:20 UTC, Jesse Glick
Details
MinimalSample_BlockSelectionWhichResultsInError (11.20 KB, image/png)
2012-06-30 09:58 UTC, markiewb
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jesse Glick 2012-05-25 15:18:16 UTC
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)
Comment 1 Jesse Glick 2012-05-25 15:18:24 UTC
Created attachment 119893 [details]
stacktrace
Comment 2 Jesse Glick 2012-05-25 15:20:40 UTC
Created attachment 119894 [details]
stacktrace
Comment 3 Jesse Glick 2012-05-25 15:24:46 UTC
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).
Comment 4 Jesse Glick 2012-05-25 15:27:36 UTC
Adding a semicolon to the end of the rewrite pattern seems to solve the CCE. (Bogus warning about Lookup remains.)
Comment 5 markiewb 2012-06-30 09:58:00 UTC
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)
Comment 6 Jan Lahoda 2013-06-04 07:27:22 UTC
http://hg.netbeans.org/jet-main/rev/2b5a5ae411e6
Comment 7 Quality Engineering 2013-06-05 09:36:04 UTC
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.