From fed467f61dd72cb4a99752ee9e34edc5612435a1 Mon Sep 17 00:00:00 2001 From: lyadis Date: Sun, 6 Oct 2019 13:59:23 +0200 Subject: [PATCH 1/2] fix(PositionBuilder): fix lambda parameters position --- .../support/compiler/jdt/PositionBuilder.java | 6 +- .../spoon/test/position/PositionTest.java | 57 ++++++++++--------- .../test/position/testclasses/MoreLambda.java | 43 ++++++++++++++ 3 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 src/test/java/spoon/test/position/testclasses/MoreLambda.java diff --git a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java index 8ec419fe2bd..111d1eee56c 100644 --- a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java @@ -224,8 +224,10 @@ SourcePosition buildPositionCtElement(CtElement e, ASTNode node) { // Handle lambda parameters without explicit type if (variableDeclaration instanceof Argument && variableDeclaration.type == null) { - declarationSourceStart = findPrevNonWhitespace(contents, 0, declarationSourceStart - 1); - declarationSourceEnd = findNextNonWhitespace(contents, contents.length - 1, declarationSourceEnd + 1); + //declarationSourceStart = findPrevNonWhitespace(contents, 0, declarationSourceStart - 1); + //declarationSourceEnd = findNextNonWhitespace(contents, contents.length - 1, declarationSourceEnd + 1); + declarationSourceStart = findPrevNonWhitespace(contents, 0, declarationSourceStart); + declarationSourceEnd = findNextNonWhitespace(contents, contents.length - 1, declarationSourceEnd); } if (modifiersSourceStart <= 0) { diff --git a/src/test/java/spoon/test/position/PositionTest.java b/src/test/java/spoon/test/position/PositionTest.java index 3251a5241f3..a03aa514040 100644 --- a/src/test/java/spoon/test/position/PositionTest.java +++ b/src/test/java/spoon/test/position/PositionTest.java @@ -71,32 +71,7 @@ import spoon.support.reflect.CtExtendedModifier; import spoon.test.comment.testclasses.BlockComment; import spoon.test.comment.testclasses.Comment1; -import spoon.test.position.testclasses.AnnonymousClassNewIface; -import spoon.test.position.testclasses.ArrayArgParameter; -import spoon.test.position.testclasses.CatchPosition; -import spoon.test.position.testclasses.CompilationUnitComments; -import spoon.test.position.testclasses.Expressions; -import spoon.test.position.testclasses.Foo; -import spoon.test.position.testclasses.FooAbstractMethod; -import spoon.test.position.testclasses.FooAnnotation; -import spoon.test.position.testclasses.FooClazz; -import spoon.test.position.testclasses.FooClazz2; -import spoon.test.position.testclasses.FooClazzWithComments; -import spoon.test.position.testclasses.FooEnum; -import spoon.test.position.testclasses.FooField; -import spoon.test.position.testclasses.FooForEach; -import spoon.test.position.testclasses.FooGeneric; -import spoon.test.position.testclasses.FooInterface; -import spoon.test.position.testclasses.FooLabel; -import spoon.test.position.testclasses.FooMethod; -import spoon.test.position.testclasses.FooStatement; -import spoon.test.position.testclasses.FooSwitch; -import spoon.test.position.testclasses.Kokos; -import spoon.test.position.testclasses.NoMethodModifiers; -import spoon.test.position.testclasses.PositionParameterTypeWithReference; -import spoon.test.position.testclasses.PositionTry; -import spoon.test.position.testclasses.SomeEnum; -import spoon.test.position.testclasses.TypeParameter; +import spoon.test.position.testclasses.*; import spoon.test.query_function.testclasses.VariableReferencesModelTest; import spoon.testing.utils.ModelUtils; @@ -1396,4 +1371,34 @@ public void testLinePositionOkWithOneLineClassCode() { assertTrue("Some Spoon elements have an invalid line position", listOfBadPositionElements.stream().allMatch(elt -> elt.getPosition().getLine() == 1)); } + + @Test + public void testLambdaParameterPosition() { + // contract: position of lambda parameter is correct + final Factory build = build(new File("src/test/java/spoon/test/position/testclasses/FooLambda.java")); + final CtType foo = build.Type().get(FooLambda.class); + + String classContent = getClassContent(foo); + + CtReturn retStmt = (CtReturn) foo.getMethodsByName("m").get(0).getBody().getStatement(0); + CtLambda lambdaExpr = (CtLambda) retStmt.getReturnedExpression(); + CtParameter param = lambdaExpr.getParameters().get(0); + assertEquals("i", contentAtPosition(classContent, param.getPosition())); + } + + @Test + public void testLambdaParameterPosition1() { + // contract: position of lambda parameter is correct + final Factory build = build(new File("src/test/java/spoon/test/position/testclasses/MoreLambda.java")); + final CtType foo = build.Type().get(MoreLambda.class); + + String classContent = getClassContent(foo); + + List lambdas = foo.getElements(new TypeFilter(CtLambda.class)); + lambdas.stream().forEach( + l -> l.getParameters().stream().forEach( + p -> assertEquals(((CtParameter) p).getSimpleName(), contentAtPosition(classContent, ((CtParameter) p).getPosition())) + ) + ); + } } diff --git a/src/test/java/spoon/test/position/testclasses/MoreLambda.java b/src/test/java/spoon/test/position/testclasses/MoreLambda.java new file mode 100644 index 00000000000..586f570e48e --- /dev/null +++ b/src/test/java/spoon/test/position/testclasses/MoreLambda.java @@ -0,0 +1,43 @@ +package spoon.test.position.testclasses; + +import java.util.function.BiPredicate; +import java.util.function.Predicate; + +public class MoreLambda { + + public static Predicate m0() { + return integer -> integer.compareTo(7) > 0; + } + + public static Predicate m1() { + return in -> in.compareTo(7) > 0; + } + + public static BiPredicate m2() { + return (i,j) -> i.compareTo(j) > 0; + } + + public static BiPredicate m3() { + return (i ,j) -> i.compareTo(j) > 0; + } + + public static BiPredicate m4() { + return (i , j) -> i.compareTo(j) > 0; + } + + public static BiPredicate m5() { + return (in , jn) -> in.compareTo(jn) > 0; + } + + public static BiPredicate m6() { + return (integer , jnteger) -> integer.compareTo(jnteger) > 0; + } + + public static BiPredicate m7() { + return (in, jn) -> in.compareTo(jn) > 0; + } + + public static BiPredicate m8() { + return ( integer ,jnteger) -> integer.compareTo(jnteger) > 0; + } +} \ No newline at end of file From cbf3430ca408190d62b8bde636146c03b780edbf Mon Sep 17 00:00:00 2001 From: lyadis Date: Sun, 6 Oct 2019 14:03:20 +0200 Subject: [PATCH 2/2] up --- .../support/compiler/jdt/PositionBuilder.java | 2 -- .../spoon/test/position/PositionTest.java | 30 +++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java index 111d1eee56c..cd17f5b8c91 100644 --- a/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/PositionBuilder.java @@ -224,8 +224,6 @@ SourcePosition buildPositionCtElement(CtElement e, ASTNode node) { // Handle lambda parameters without explicit type if (variableDeclaration instanceof Argument && variableDeclaration.type == null) { - //declarationSourceStart = findPrevNonWhitespace(contents, 0, declarationSourceStart - 1); - //declarationSourceEnd = findNextNonWhitespace(contents, contents.length - 1, declarationSourceEnd + 1); declarationSourceStart = findPrevNonWhitespace(contents, 0, declarationSourceStart); declarationSourceEnd = findNextNonWhitespace(contents, contents.length - 1, declarationSourceEnd); } diff --git a/src/test/java/spoon/test/position/PositionTest.java b/src/test/java/spoon/test/position/PositionTest.java index a03aa514040..7f7216c27f9 100644 --- a/src/test/java/spoon/test/position/PositionTest.java +++ b/src/test/java/spoon/test/position/PositionTest.java @@ -70,8 +70,34 @@ import spoon.support.compiler.VirtualFile; import spoon.support.reflect.CtExtendedModifier; import spoon.test.comment.testclasses.BlockComment; -import spoon.test.comment.testclasses.Comment1; -import spoon.test.position.testclasses.*; +import spoon.test.comment.testclasses.Comment1;import spoon.test.position.testclasses.AnnonymousClassNewIface; +import spoon.test.position.testclasses.ArrayArgParameter; +import spoon.test.position.testclasses.CatchPosition; +import spoon.test.position.testclasses.CompilationUnitComments; +import spoon.test.position.testclasses.Expressions; +import spoon.test.position.testclasses.Foo; +import spoon.test.position.testclasses.FooAbstractMethod; +import spoon.test.position.testclasses.FooAnnotation; +import spoon.test.position.testclasses.FooClazz; +import spoon.test.position.testclasses.FooClazz2; +import spoon.test.position.testclasses.FooClazzWithComments; +import spoon.test.position.testclasses.FooEnum; +import spoon.test.position.testclasses.FooField; +import spoon.test.position.testclasses.FooForEach; +import spoon.test.position.testclasses.FooGeneric; +import spoon.test.position.testclasses.FooInterface; +import spoon.test.position.testclasses.FooLabel; +import spoon.test.position.testclasses.FooLambda; +import spoon.test.position.testclasses.FooMethod; +import spoon.test.position.testclasses.FooStatement; +import spoon.test.position.testclasses.FooSwitch; +import spoon.test.position.testclasses.Kokos; +import spoon.test.position.testclasses.NoMethodModifiers; +import spoon.test.position.testclasses.PositionParameterTypeWithReference; +import spoon.test.position.testclasses.PositionTry; +import spoon.test.position.testclasses.SomeEnum; +import spoon.test.position.testclasses.TypeParameter; +import spoon.test.position.testclasses.MoreLambda; import spoon.test.query_function.testclasses.VariableReferencesModelTest; import spoon.testing.utils.ModelUtils;