Skip to content

Commit

Permalink
Support for new CaseStatement constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
Rawi01 committed Mar 18, 2024
1 parent 2bc32e1 commit 44d0e68
Showing 1 changed file with 45 additions and 15 deletions.
60 changes: 45 additions & 15 deletions src/utils/lombok/eclipse/Eclipse.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2021 The Project Lombok Authors.
* Copyright (C) 2009-2024 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand All @@ -21,6 +21,7 @@
*/
package lombok.eclipse;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -279,22 +280,51 @@ private static boolean ecjSupportsJava7Features() {
}
}

private static boolean caseStatementInit = false;
private static Field caseStatementConstantExpressions = null;
private static final Field CASE_STATEMENT_CONSTANT_EXPRESSIONS = Permit.permissiveGetField(CaseStatement.class, "constantExpressions");
private static final Constructor<CaseStatement> CASE_STATEMENT_CONSTRUCTOR_SINGLE;
private static final Constructor<CaseStatement> CASE_STATEMENT_CONSTRUCTOR_ARRAY;
private static final Expression[] EMPTY_EXPRESSIONS;
static {
Constructor<CaseStatement> constructorSingle = null, constructorArray = null;
Expression[] emptyExpressions = new Expression[0];

try {
constructorSingle = Permit.getConstructor(CaseStatement.class, Expression.class, int.class, int.class);
} catch (NoSuchMethodException ignore) {
}

try {
constructorArray = Permit.getConstructor(CaseStatement.class, Expression[].class, int.class, int.class);
} catch (NoSuchMethodException ignore) {
}

try {
emptyExpressions = Permit.get(Permit.permissiveGetField(Expression.class, "NO_EXPRESSIONS"), null);
} catch (Throwable ignore) {
}

CASE_STATEMENT_CONSTRUCTOR_SINGLE = constructorSingle;
CASE_STATEMENT_CONSTRUCTOR_ARRAY = constructorArray;
EMPTY_EXPRESSIONS = emptyExpressions;
}
public static CaseStatement createCaseStatement(Expression expr) {
CaseStatement stat = new CaseStatement(expr, 0, 0);
if (expr == null) return stat;
if (!caseStatementInit) {
try {
caseStatementConstantExpressions = Permit.getField(CaseStatement.class, "constantExpressions");
caseStatementConstantExpressions.setAccessible(true);
} catch (NoSuchFieldException ignore) {}
caseStatementInit = true;
Expression[] expressions = EMPTY_EXPRESSIONS;
if (expr != null) {
expressions = new Expression[] {expr};
}

final CaseStatement stat;
if (CASE_STATEMENT_CONSTRUCTOR_SINGLE != null) {
stat = Permit.newInstanceSneaky(CASE_STATEMENT_CONSTRUCTOR_SINGLE, expr, 0, 0);
if (stat != null && CASE_STATEMENT_CONSTANT_EXPRESSIONS != null) {
try {
Permit.set(CASE_STATEMENT_CONSTANT_EXPRESSIONS, stat, expressions);
} catch (IllegalAccessException ignore) {
}
}
} else {
stat = Permit.newInstanceSneaky(CASE_STATEMENT_CONSTRUCTOR_ARRAY, expressions, 0, 0);
}
if (caseStatementConstantExpressions != null) try {
caseStatementConstantExpressions.set(stat, new Expression[] {expr});
} catch (IllegalArgumentException ignore) {
} catch (IllegalAccessException ignore) {}
return stat;
}
}

0 comments on commit 44d0e68

Please sign in to comment.