PsiExpression (@NotNull PsiExpression expr, @NotNull ClsElementImpl parent) { if (expr instanceof PsiLiteralExpression) { PsiFile file = parent.getContainingFile(); boolean forDecompiling = file instanceof ClsFileImpl && ((ClsFileImpl)file).isForDecompiling(); PsiType type = forDecompiling ? (PsiPrimitiveType)PsiTypes.nullType() : expr.getType(); Object value = forDecompiling ? null : ((PsiLiteralExpression)expr).getValue(); return new ClsLiteralExpressionImpl(parent, expr.getText(), type, value); } if (expr instanceof PsiPrefixExpression) { PsiJavaToken sign = ((PsiPrefixExpression)expr).getOperationSign(); PsiExpression operand = ((PsiPrefixExpression)expr).getOperand(); if (operand == null) { LOG.error("Invalid prefix expression: " + expr + " [" + expr.getText() + "]"); return null; } return new ClsPrefixExpressionImpl(parent, sign, operand); } if (expr instanceof PsiClassObjectAccessExpression) { String exprText = expr.getText(); if (StringUtil.endsWith(exprText, ".class")) { String classText = exprText.substring(0, exprText.length() - 6); return new ClsClassObjectAccessExpressionImpl(parent, classText); } } if (expr instanceof PsiReferenceExpression) { return new ClsReferenceExpressionImpl(parent, (PsiReferenceExpression)expr); } if (expr instanceof PsiBinaryExpression) { PsiJavaToken sign = ((PsiBinaryExpression)expr).getOperationSign(); PsiExpression left = ((PsiBinaryExpression)expr).getLOperand(); PsiExpression right = ((PsiBinaryExpression)expr).getROperand(); if (right == null) { LOG.error("Invalid binary expression: " + expr + " [" + expr.getText() + "]"); return null; } return new ClsBinaryExpressionImpl(parent, sign, left, right); } PsiFile file = parent.getContainingFile(); if (file instanceof ClsFileImpl && ((ClsFileImpl)file).isForDecompiling()) { return new ClsLiteralExpressionImpl(parent, expr.getText(), PsiTypes.nullType(), null); } PsiConstantEvaluationHelper evaluator = JavaPsiFacade.getInstance(expr.getProject()).getConstantEvaluationHelper(); Object value = evaluator.computeConstantExpression(expr); if (value != null) { return new ClsLiteralExpressionImpl(parent, expr.getText(), expr.getType(), value); } LOG.error("Unable to compute expression value: " + expr + " [" + expr.getText() + "]"); return null; }