eclipse-xtext / eclipse-xtext/xtext

java.lang.IllegalArgumentException: argument is not valid in current context

Open
#2,567 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
831
Forks
330
Avg merge
3d 7h
Merged PRs (30d)
12

Description

I am getting an exception for some xtend code for a Jenkins plugin that should be valid. It may be getting confused on the complicated generics definition. See code below.

If I explicitly define the type of the "run" variable it works:

val run = mock(Run)

to

val Run<?, ?> run = mock(Run)

hudson.model.Run definition (2.7.1):

@ExportedBean
public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,RunT>>
        extends Actionable implements ExtensionPoint, Comparable<RunT>, AccessControlled, PersistenceRoot, DescriptorByNameOwner, OnMaster {

Gradle plugin: org.xtext:xtext-gradle-plugin:1.0.19
Xtend version: 'org.eclipse.xtend:org.eclipse.xtend.lib:2.12.0'

Also reported here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=528739

Stacktrace:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateTestXtext'.
...
Caused by: java.lang.IllegalArgumentException: argument is not valid in current context
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.addTypeArgument(ParameterizedTypeReference.java:781)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.enhanceParameterizedTypeReference(TypeParameterSubstitutor.java:142)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:134)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:116)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:36)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:840)
at org.eclipse.xtext.xbase.typesystem.util.UnboundTypeParameterPreservingSubstitutor.getBoundTypeArgument(UnboundTypeParameterPreservingSubstitutor.java:53)
at org.eclipse.xtext.xbase.typesystem.util.UnboundTypeParameterPreservingSubstitutor.getBoundTypeArgument(UnboundTypeParameterPreservingSubstitutor.java:27)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:112)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:36)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:840)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.visitTypeArgument(TypeParameterSubstitutor.java:103)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.visitTypeArgument(TypeParameterSubstitutor.java:96)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.enhanceParameterizedTypeReference(TypeParameterSubstitutor.java:142)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:134)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:116)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:36)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:840)
at org.eclipse.xtext.xbase.typesystem.util.UnboundTypeParameterPreservingSubstitutor.getBoundTypeArgument(UnboundTypeParameterPreservingSubstitutor.java:53)
at org.eclipse.xtext.xbase.typesystem.util.UnboundTypeParameterPreservingSubstitutor.getBoundTypeArgument(UnboundTypeParameterPreservingSubstitutor.java:27)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:112)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:36)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:840)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.visitTypeArgument(TypeParameterSubstitutor.java:103)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.visitTypeArgument(TypeParameterSubstitutor.java:96)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.enhanceParameterizedTypeReference(TypeParameterSubstitutor.java:142)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:134)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:116)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.doVisitParameterizedTypeReference(TypeParameterSubstitutor.java:36)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:840)
at org.eclipse.xtext.xbase.typesystem.util.TypeParameterSubstitutor.substitute(TypeParameterSubstitutor.java:224)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker$ParameterizedTypeReferenceTraverser.doVisitMatchingTypeParameters(AbstractTypeReferencePairWalker.java:251)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker$ParameterizedTypeReferenceTraverser.doVisitParameterizedTypeReference(AbstractTypeReferencePairWalker.java:199)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker$ParameterizedTypeReferenceTraverser.doVisitParameterizedTypeReference(AbstractTypeReferencePairWalker.java:186)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:828)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker.doVisitParameterizedTypeReference(AbstractTypeReferencePairWalker.java:370)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker.doVisitParameterizedTypeReference(AbstractTypeReferencePairWalker.java:39)
at org.eclipse.xtext.xbase.typesystem.references.ParameterizedTypeReference.accept(ParameterizedTypeReference.java:828)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker.outerVisit(AbstractTypeReferencePairWalker.java:429)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker.outerVisit(AbstractTypeReferencePairWalker.java:412)
at org.eclipse.xtext.xbase.typesystem.util.AbstractTypeReferencePairWalker.processPairedReferences(AbstractTypeReferencePairWalker.java:438)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.deferredBindTypeArgument(AbstractLinkingCandidate.java:419)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.applyToComputationState(AbstractLinkingCandidate.java:371)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:1091)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer.computeTypes(XbaseTypeComputer.java:100)
at org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsTypeComputer.computeTypes(XbaseWithAnnotationsTypeComputer.java:46)
at org.eclipse.xtend.core.typesystem.XtendTypeComputer.computeTypes(XtendTypeComputer.java:64)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.resolveArgumentType(AbstractLinkingCandidate.java:627)
at org.eclipse.xtext.xbase.typesystem.internal.FeatureLinkingCandidate.resolveArgumentType(FeatureLinkingCandidate.java:963)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.computeFixedArityArgumentType(AbstractLinkingCandidate.java:579)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.computeArgumentType(AbstractLinkingCandidate.java:443)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.computeArgumentTypes(AbstractLinkingCandidate.java:430)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.preApply(AbstractLinkingCandidate.java:378)
at org.eclipse.xtext.xbase.typesystem.internal.FeatureLinkingCandidate.preApply(FeatureLinkingCandidate.java:896)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractLinkingCandidate.applyToComputationState(AbstractLinkingCandidate.java:286)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState$5.applyToComputationState(AbstractTypeComputationState.java:511)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:1091)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer.computeTypes(XbaseTypeComputer.java:100)
at org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsTypeComputer.computeTypes(XbaseWithAnnotationsTypeComputer.java:46)
at org.eclipse.xtend.core.typesystem.XtendTypeComputer.computeTypes(XtendTypeComputer.java:64)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer._computeTypes(XbaseTypeComputer.java:469)
at org.eclipse.xtext.xbase.typesystem.computation.XbaseTypeComputer.computeTypes(XbaseTypeComputer.java:106)
at org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsTypeComputer.computeTypes(XbaseWithAnnotationsTypeComputer.java:46)
at org.eclipse.xtend.core.typesystem.XtendTypeComputer.computeTypes(XtendTypeComputer.java:64)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.doComputeTypes(AbstractTypeComputationState.java:121)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractTypeComputationState.computeTypes(AbstractTypeComputationState.java:109)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractRootTypeComputationState.computeTypes(AbstractRootTypeComputationState.java:32)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._computeTypes(LogicalContainerAwareReentrantTypeResolver.java:827)
at org.eclipse.xtend.core.typesystem.XtendReentrantTypeResolver._computeTypes(XtendReentrantTypeResolver.java:612)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:711)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeMemberTypes(LogicalContainerAwareReentrantTypeResolver.java:897)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver._computeTypes(LogicalContainerAwareReentrantTypeResolver.java:886)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:705)
at org.eclipse.xtext.xbase.typesystem.internal.LogicalContainerAwareReentrantTypeResolver.computeTypes(LogicalContainerAwareReentrantTypeResolver.java:697)
at org.eclipse.xtend.core.typesystem.XtendReentrantTypeResolver.computeTypes(XtendReentrantTypeResolver.java:382)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.resolve(DefaultReentrantTypeResolver.java:163)
at org.eclipse.xtext.xbase.typesystem.internal.DefaultReentrantTypeResolver.reentrantResolve(DefaultReentrantTypeResolver.java:139)
at org.eclipse.xtext.xbase.typesystem.internal.CompoundReentrantTypeResolver.reentrantResolve(CompoundReentrantTypeResolver.java:79)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$LazyResolvedTypes.resolveTypes(CachingBatchTypeResolver.java:80)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:57)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver$2.process(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.util.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:37)
at org.eclipse.xtext.util.OnChangeEvictingCache.execWithoutCacheClear(OnChangeEvictingCache.java:129)
at org.eclipse.xtext.xbase.typesystem.internal.CachingBatchTypeResolver.doResolveTypes(CachingBatchTypeResolver.java:53)
at org.eclipse.xtext.xbase.typesystem.internal.AbstractBatchTypeResolver.resolveTypes(AbstractBatchTypeResolver.java:69)
at org.eclipse.xtext.xbase.resource.BatchLinkingService.resolveBatched(BatchLinkingService.java:71)
at org.eclipse.xtext.xbase.resource.BatchLinkableResource.resolveLazyCrossReferences(BatchLinkableResource.java:165)
at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:498)
at org.eclipse.xtext.build.IncrementalBuilder$InternalStatefulIncrementalBuilder.lambda$launch$6(IncrementalBuilder.java:236)
at org.eclipse.xtext.build.ClusteringStorageAwareResourceLoader.lambda$executeClustered$1(ClusteringStorageAwareResourceLoader.java:77)
at org.eclipse.xtext.xbase.lib.internal.FunctionDelegate.apply(FunctionDelegate.java:42)
at com.google.common.collect.Lists$TransformingRandomAccessList$1.transform(Lists.java:617)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at com.google.common.collect.Iterables.addAll(Iterables.java:352)
at org.eclipse.xtext.build.ClusteringStorageAwareResourceLoader.executeClustered(ClusteringStorageAwareResourceLoader.java:80)
at org.eclipse.xtext.build.BuildContext.executeClustered(BuildContext.java:55)
at org.eclipse.xtext.build.IncrementalBuilder$InternalStatefulIncrementalBuilder.launch(IncrementalBuilder.java:251)
at org.eclipse.xtext.build.IncrementalBuilder.build(IncrementalBuilder.java:399)
at org.eclipse.xtext.build.IncrementalBuilder.build(IncrementalBuilder.java:384)
at org.xtext.gradle.builder.XtextGradleBuilder.doBuild(XtextGradleBuilder.java:360)
at org.xtext.gradle.builder.XtextGradleBuilder.build(XtextGradleBuilder.java:206)
at org.xtext.gradle.tasks.XtextGenerate.generate(XtextGenerate.java:149)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
... 70 more

MyPublisher.xtend

package hudson.plugins.mypublisher

import hudson.Extension
import hudson.FilePath
import hudson.Launcher
import hudson.model.AbstractProject
import hudson.model.Run
import hudson.model.TaskListener
import hudson.tasks.BuildStepDescriptor
import hudson.tasks.BuildStepMonitor
import hudson.tasks.Publisher
import hudson.tasks.Recorder
import java.io.IOException
import javax.annotation.Nonnull
import jenkins.tasks.SimpleBuildStep
import org.eclipse.xtend.lib.annotations.Accessors
import org.kohsuke.stapler.DataBoundConstructor
import org.kohsuke.stapler.DataBoundSetter

class MyPublisher extends Recorder implements SimpleBuildStep  {
    @Accessors
    var String foobar;
    
    @Accessors
    var boolean changeBuildStatus
    
    @DataBoundConstructor
    new () {
        this.foobar = "**/foobar.json"
    }
    
    @DataBoundSetter
    def void setFoobar(String foobar) {
        this.foobar = foobar
    }

    override perform(@Nonnull Run<?, ?> run, @Nonnull FilePath filePath, @Nonnull Launcher launcher, @Nonnull TaskListener taskListener) throws InterruptedException, IOException {
        println("FOOBAR")
    }
    
    override getRequiredMonitorService() {
        return BuildStepMonitor.NONE
    }
    
    override BuildStepDescriptor<Publisher> getDescriptor() {
        return super.getDescriptor() as BuildStepDescriptor<Publisher>;
    }
    
    public static BuildStepDescriptor<Publisher> DESCRIPTOR;
    
    @Extension
    static class DesciptorImpl extends BuildStepDescriptor<Publisher> {
        override getDisplayName() {
            return '''Foobar''';
        }
        
        override isApplicable(Class<? extends AbstractProject> jobType) {
            return true;
        }
    }   
}

MyPublisherTests.xtend:

package hudson.plugins.mypublisher

import hudson.EnvVars
import hudson.FilePath
import hudson.Launcher
import hudson.model.Run
import hudson.model.TaskListener
import org.junit.Test

import hudson.plugins.mypublisher.MyPublisher
import static org.mockito.Mockito.*


class MyPublisherTests {
    
    @Test
    def void testPerform() {
        val env = mock(EnvVars)
        val run = mock(Run)
        val workspace = mock(FilePath)
        val launcher = mock(Launcher)
        val taskListener = mock(TaskListener)
        
        val publisher = new MyPublisher()
        
        // This line causes the error
        publisher.perform(run, workspace, launcher, taskListener)
        
    }
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the stack-trace entry points ParameterizedTypeReference.java and TypeParameterSubstitutor.java, then trace the type computation through AbstractLinkingCandidate. Reproduce the failure with the shown Xtend mock(Run) expression and Jenkins Run generic declaration. Done means valid code no longer throws IllegalArgumentException when the variable type is inferred, while the explicitly typed form continues to work.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.