INRIA / INRIA/spoon

[Bug]: Calling `setSimpleName` on an anonymous class leads to broken code

Open
#6,272 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

A simple call to `setSimpleName` on an anonymous `CtClass` will lead to broken code output. It would be nice if this could be prohibited in the type system, but I guess there is a reason why anonymous classes are ordinary `CtClass`es that inherit from `CtNamedElement` and get a generated name (cf. https://github.com/INRIA/spoon/issues/6244). A more ugly fix would be to override `setSimpleName` within `CtClass` and throw an exception when `isAnonymous` is true.

I am currently handling this issue by checking `CtClass.isAnonymous` in client code and skipping those AST elements, if true.

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

```Java
public class SomeClass {
private SomeClass createAnonymous() {
return new SomeClass() {};
}
}
```

### Source code for your Spoon processing

```Java
var l = Launcher.parseClass("public class SomeClass { private SomeClass createAnonymous() { return new SomeClass() {}; } }");
var classes = l.getElements(new TypeFilter<>(CtClass.class));
var iter = classes.iterator();
iter.next(); iter.next().setSimpleName("Anonymous");
System.out.println(l.prettyprint());
```

### Actual output

```Java
public class SomeClass {
private SomeClass createAnonymous() {
return new SomeClass()class Anonymous extends {};
}
}
```

### Expected output

```Java
public class SomeClass {
private SomeClass createAnonymous() {
return new SomeClass() {};
}
}
```

### Spoon Version

11.2.0

### JVM Version

openjdk 24.0.1

### What operating system are you using?

Arch 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.