Skip to content

Rename class with pattern matching instanceof fails with BINDING_PATTERN com.sun.tools.javac.tree.JCTree$JCBindingPattern #9645

Open

Description

@williamgates108

Apache NetBeans version

Apache NetBeans 31

What happened

NetBeans 31, when renaming a class that has a JDK 16+ "pattern matching instanceof"

if (cp instanceof GrandProjectContextProvider gcp)

Image
INFO [org.netbeans.ui.indexing]: Indexing finished, indexing took 0 ms.
INFO [org.netbeans.modules.refactoring.spi.impl.ParametersPanel]: org.netbeans.modules.refactoring.api.AbstractRefactoring$ProgressL@2c1ed6fc called start multiple times
INFO [null]: Last record repeated again.
SEVERE [org.openide.util.Exceptions]
java.lang.AssertionError: BINDING_PATTERN com.sun.tools.javac.tree.JCTree$JCBindingPattern
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3484)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.matchTypeTest(CasualDiff.java:6137)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3384)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3378)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.matchIf(CasualDiff.java:6077)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3354)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.listsMatch(CasualDiff.java:6009)
	at org.netbeans.modules.java.source.save.CasualDiff.matchBlock(CasualDiff.java:6023)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3330)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.matchLambda(CasualDiff.java:6192)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3456)
	at org.netbeans.modules.java.source.save.CasualDiff.treesMatch(CasualDiff.java:3300)
	at org.netbeans.modules.java.source.save.CasualDiff.listsMatch(CasualDiff.java:6009)
	at org.netbeans.modules.java.source.save.CasualDiff.diffApply(CasualDiff.java:2494)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5787)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5501)
	at org.netbeans.modules.java.source.save.CasualDiff.diffExec(CasualDiff.java:2385)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5766)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5501)
	at org.netbeans.modules.java.source.save.CasualDiff.diffList(CasualDiff.java:4314)
	at org.netbeans.modules.java.source.save.CasualDiff.diffBlock(CasualDiff.java:1805)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5727)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5501)
	at org.netbeans.modules.java.source.save.CasualDiff.diffMethodDef(CasualDiff.java:1494)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5717)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5501)
	at org.netbeans.modules.java.source.save.CasualDiff.diffList(CasualDiff.java:4314)
	at org.netbeans.modules.java.source.save.CasualDiff.diffClassDef(CasualDiff.java:1204)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5714)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5501)
	at org.netbeans.modules.java.source.save.CasualDiff.diffList(CasualDiff.java:4314)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTopLevel(CasualDiff.java:602)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5684)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5603)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5530)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5513)
	at org.netbeans.modules.java.source.save.CasualDiff.diff(CasualDiff.java:358)
	at org.netbeans.api.java.source.WorkingCopy.processCurrentCompilationUnit(WorkingCopy.java:889)
	at org.netbeans.api.java.source.WorkingCopy.getChanges(WorkingCopy.java:1304)
	at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:672)
	at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:661)
	at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
	at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
	at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:235)
	at org.netbeans.modules.parsing.api.ParserManager$MultiUserTaskAction.run(ParserManager.java:205)
	at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
	at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
	at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
	at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:341)
	at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
	at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
	at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
	at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:85)
	at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
	at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
	at org.netbeans.api.java.source.JavaSource.runModificationTask(JavaSource.java:680)
	at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:325)
	at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:264)
	at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.processFiles(JavaRefactoringPlugin.java:246)
	at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.createAndAddElements(JavaRefactoringPlugin.java:340)
	at org.netbeans.modules.refactoring.java.spi.JavaRefactoringPlugin.createAndAddElements(JavaRefactoringPlugin.java:356)
	at org.netbeans.modules.refactoring.java.plugins.RenameRefactoringPlugin.prepare(RenameRefactoringPlugin.java:613)
[catch] at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare2(AbstractRefactoring.java:417)
	at org.netbeans.modules.refactoring.api.AbstractRefactoring.pluginsPrepare(AbstractRefactoring.java:401)
	at org.netbeans.modules.refactoring.api.AbstractRefactoring.prepare(AbstractRefactoring.java:212)
	at org.netbeans.modules.refactoring.spi.impl.ParametersPanel$Prepare.run(ParametersPanel.java:1063)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1370)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1981)

Language / Project Type / NetBeans Component

No response

How to reproduce

Rename a class that has a reference using the pattern matching instanceof

Did this work correctly in an earlier version?

No / Don't know

Operating System

Ubuntu 22.04

JDK

JDK 26.0.2

Apache NetBeans packaging

Community provided installer

Anything else

Always i would say

Are you willing to submit a pull request?

No

Activity

  1. changed the title [-]BINDING_PATTERN com.sun.tools.javac.tree.JCTree$JCBindingPattern[/-] [+]Rename class with pattern matching instanceof fails with BINDING_PATTERN com.sun.tools.javac.tree.JCTree$JCBindingPattern[/+] on Sep 29, 2026
  2. added
    Java[ci] enable extra Java tests (java.completion, java.source.base, java.hints, refactoring.java, form)
    on Oct 6, 2026
  3. mbien commented on Oct 6, 2026

    @mbien
    Member

    hmm. can't reproduce unfortunately. Both inner and outer class renaming worked using the snippet below

        private static class InnerFoo {}
    
        public static void main(String[] args) {
            Object obj = null;
            if (obj instanceof InnerFoo foo) {
                
            } else if (obj instanceof OuterFoo foo) {
                
            }
        }
  4. williamgates108 commented on Oct 7, 2026

    @williamgates108
    Author

    Thanks @mbien , i'll see if i can get a reproducible code snippet when i have time ok?

  5. mbien commented on Oct 9, 2026

    @mbien
    Member

    @lahodaj does the switch in CasualDiff#treesMatch need updates? e.g case label added?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Java[ci] enable extra Java tests (java.completion, java.source.base, java.hints, refactoring.java, form)cannot reproducekind:bugBug report or fixneeds:triageRequires attention from one of the committers

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions