boolean (@Nullable PsiExpression expression) { if (expression instanceof PsiLiteralExpression) { return true; } if (expression instanceof final PsiPolyadicExpression polyadicExpression) { final PsiExpression[] operands = polyadicExpression.getOperands(); for (PsiExpression operand : operands) { if (!isEvaluatedAtCompileTime(operand)) { return false; } } return true; } if (expression instanceof final PsiPrefixExpression prefixExpression) { final PsiExpression operand = prefixExpression.getOperand(); return isEvaluatedAtCompileTime(operand); } if (expression instanceof final PsiReferenceExpression referenceExpression) { final PsiElement qualifier = referenceExpression.getQualifier(); if (qualifier instanceof PsiThisExpression) { return false; } final PsiElement element = referenceExpression.resolve(); if (element instanceof final PsiVariable variable) { if (PsiTreeUtil.isAncestor(variable, expression, true)) { return false; } return variable.hasModifierProperty(PsiModifier.FINAL) && isEvaluatedAtCompileTime(PsiFieldImpl.getDetachedInitializer(variable)); } } if (expression instanceof final PsiParenthesizedExpression parenthesizedExpression) { final PsiExpression deparenthesizedExpression = parenthesizedExpression.getExpression(); return isEvaluatedAtCompileTime(deparenthesizedExpression); } if (expression instanceof final PsiConditionalExpression conditionalExpression) { final PsiExpression condition = conditionalExpression.getCondition(); final PsiExpression thenExpression = conditionalExpression.getThenExpression(); final PsiExpression elseExpression = conditionalExpression.getElseExpression(); return isEvaluatedAtCompileTime(condition) && isEvaluatedAtCompileTime(thenExpression) && isEvaluatedAtCompileTime(elseExpression); } if (expression instanceof final PsiTypeCastExpression typeCastExpression) { final PsiTypeElement castType = typeCastExpression.getCastType(); if (castType == null) { return false; } final PsiType type = castType.getType(); return TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, type) && isEvaluatedAtCompileTime(typeCastExpression.getOperand()); } return false; }