Avoid duplicating constant assignments to final instance fields #1998
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The
ConstantValueToInitializerTransformer
ensures for instance fields initialized with a default constant value, that constructor implementation(s) have the constant assignment to such instance fields immediately after the call tosuper
constructor. Forfinal
instance fields with constant initializers, however, the constant assignment statement is already present in the generated Jimple body of the constructor(s), and furthermore its ordinal position within the body should not matter since they cannot be overwritten. Since the current implementation does not check for this case, a duplicate copy of such constant assignment statements are introduced.This behavior can affect downstream analyses- e.g., we observe that Tags computed from a liveness analysis are lost when such constant assignment statements are incorrectly duplicated.
Solution
We check for the presence of an existing assignment statement that initializes the given instance field with the given constant value (
isInstanceFieldAssignedConstantInBody()
), and avoid duplication if present.Testing
mvn clean verify