INRIA / INRIA/spoon

[Bug]: Orphan comment is not pretty printed by Spoon

Open
#4,816 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
2k
Forks
392
Avg merge
11h 24m
Merged PRs (30d)
36

Description

### Describe the bug

It seems that Spoon's pretty print feature is not able to handle orphan comments (e.g., comments at the very end of a method).

### Source code you are trying to analyze/transform

```Java
// /tmp/demo-in/org/Foo.java

package org;

public class Foo {

@Test
public void should_match() throws Exception {
class WithMockAndSpy {
@Spy private InnerStrength strength;
@Mock private List list;

abstract class InnerStrength {
private final String name;

InnerStrength() {
// Make sure that @Mock fields are always injected before @Spy fields.
assertNotNull(list);
// Make sure constructor is indeed called.
this.name = "inner";
}

abstract String strength();

String fullStrength() {
return name + " " + strength();
}
}
}

WithMockAndSpy outer = new WithMockAndSpy();
MockitoAnnotations.initMocks(outer);
when(outer.strength.strength()).thenReturn("strength");
// orphan comment
}
}
```

### Source code for your Spoon processing

```Java
final Launcher launcher = new Launcher();

launcher.addInputResource("/tmp/demo-in/org/Foo.java");
launcher.getEnvironment().setSourceOutputDirectory(new File("/tmp/demo-out"));
launcher.getEnvironment().setCommentEnabled(true);

launcher.run();
```

### Actual output

```Java
package org;
public class Foo {
@org.Test
public void should_match() throws java.lang.Exception {
class WithMockAndSpy {
@org.Spy
private WithMockAndSpy.InnerStrength strength;

@org.Mock
private org.List list;

abstract class InnerStrength {
private final java.lang.String name;

InnerStrength() {
// Make sure that @Mock fields are always injected before @Spy fields.
assertNotNull(list);
// Make sure constructor is indeed called.
this.name = "inner";
}

abstract java.lang.String strength();

java.lang.String fullStrength() {
return (name + " ") + strength();
}
}
}
WithMockAndSpy outer = new WithMockAndSpy();
org.MockitoAnnotations.initMocks(outer);
when(outer.strength.strength()).thenReturn("strength");
}
}
```

### Expected output

```Java
package org;
public class Foo {
@org.Test
public void should_match() throws java.lang.Exception {
class WithMockAndSpy {
@org.Spy
private WithMockAndSpy.InnerStrength strength;

@org.Mock
private org.List list;

abstract class InnerStrength {
private final java.lang.String name;

InnerStrength() {
// Make sure that @Mock fields are always injected before @Spy fields.
assertNotNull(list);
// Make sure constructor is indeed called.
this.name = "inner";
}

abstract java.lang.String strength();

java.lang.String fullStrength() {
return (name + " ") + strength();
}
}
}
WithMockAndSpy outer = new WithMockAndSpy();
org.MockitoAnnotations.initMocks(outer);
when(outer.strength.strength()).thenReturn("strength");
// orphan comment
}
}
```

### Spoon Version

10.2.0-beta-12

### JVM Version

11

### What operating system are you using?

Linux

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.