CpsCallableInvocation.checkMismatch with @NonCPS method calling simple groovy getter (not any step)

This issue is archived. You can view it, but you can't modify it. Learn more

XMLWordPrintable

      The following document provides an example how to handle native NonCPS methods like toString.

      https://wiki.jenkins.io/display/JENKINS/Pipeline+CPS+method+mismatches#PipelineCPSmethodmismatches-Overridesofnon-CPS-transformedmethods

      class Test {
        @Override
        public String toString() {
          return "Test"
        }
      }
      def builder = new StringBuilder()
      builder.append(new Test())
      echo(builder.toString()) 

       

      But this example is way to trivial, as toString in 99,99% returns variable information usually provided by a couple of handy methods of the class, like in this case with CPS getFullName method

      class Test {
          String name
      
          Test(String name) {
              this.name = name
          }
      
          String getFullName() {
              return 'some prefix ' + name
          }
      
          @NonCPS
          @Override
          public String toString() {
              return this.fullName
          }
      
      }
      
      def builder = new StringBuilder()
      builder.append(new Test('foobar'))
      echo(builder.toString())

      Previously this code worked as it doesn't call any steps as the document suggest, but now it started to raise 

      java.lang.IllegalStateException: expected to call java.lang.StringBuilder.append but wound up catching Test.getFullName; see: https://jenkins.io/redirect/pipeline-cps-method-mismatches

      Obviously it's possible to put in @NonCPS for getFullName but that simply means that almost all methods by default must be @NonCPS, and only those that call steps must be CPS ones.

      Can we have this 
      'org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService.handleMismatch'
      properly fixed as there's actually no mismatch, as even explicit toString

      (new Test('foobar')).toString() 

      doesn't help to work this around?

       

            Assignee:
            Unassigned
            Reporter:
            Dicom J
            Archiver:
            Jenkins Service Account

              Created:
              Updated:
              Archived: