diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java index 1e0761ff521..abf805f2d90 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.ILocalVariable; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; @@ -69,6 +70,7 @@ import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.NameQualifiedType; +import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.PrimitiveType; import org.eclipse.jdt.core.dom.QualifiedName; @@ -5463,4 +5465,22 @@ public void testCaptureBinding18() throws CoreException { assertEquals("bound's type argument is the original type argument", binding, bound.getTypeArguments()[0]); } +public void testLambdaParameterSourcePosition() throws JavaModelException { + String contents = """ + class X { + I lambda = (x, y) -> {}; + } + interface I { + public void apply(Integer k, Integer l); + } + """; + this.workingCopy = getWorkingCopy("/Converter11/src/X.java", true/*resolve*/); + ASTNode node = buildAST(contents, this.workingCopy); + Name name = (Name)NodeFinder.perform(node, contents.indexOf('y'), 0); + IVariableBinding variableBinding = (IVariableBinding)name.resolveBinding(); + ILocalVariable variableElement = (ILocalVariable)variableBinding.getJavaElement(); + assertEquals(26, variableElement.getSourceRange().getOffset()); + assertEquals(1, variableElement.getSourceRange().getLength()); +} + } diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java index 769343567f5..36da0d44da2 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableBinding.java @@ -237,20 +237,17 @@ private JavaElement getUnresolvedJavaElement() { SimpleName localName = localVar.getName(); int nameStart = localName.getStartPosition(); int nameLength = localName.getLength(); - int sourceStart; - int sourceLength; + int sourceStart = localVar.getStartPosition(); + int sourceLength = localVar.getLength(); int modifiers = 0; - if (localVar instanceof SingleVariableDeclaration) { - sourceStart = localVar.getStartPosition(); - sourceLength = localVar.getLength(); - final SingleVariableDeclaration singleVariableDeclaration = (SingleVariableDeclaration) localVar; + if (localVar instanceof SingleVariableDeclaration singleVariableDeclaration) { modifiers = singleVariableDeclaration.getModifiers(); - } else { - ASTNode node = localVar.getParent(); - sourceStart = node.getStartPosition(); - sourceLength = node.getLength(); - VariableDeclarationFragment fragment = (VariableDeclarationFragment) localVar; + } else if (localVar instanceof VariableDeclarationFragment fragment) { final ASTNode parent = fragment.getParent(); + if (!(parent instanceof LambdaExpression)) { + sourceStart = parent.getStartPosition(); + sourceLength = parent.getLength(); + } switch (parent.getNodeType()) { case ASTNode.VARIABLE_DECLARATION_EXPRESSION : VariableDeclarationExpression expression = (VariableDeclarationExpression) parent;