/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * User: anna * Date: 28-Oct-2008 */ package com.intellij.psi.util; import com.intellij.psi.*; import com.intellij.util.Function; public class PsiExpressionTrimRenderer extends JavaRecursiveElementWalkingVisitor { private final StringBuilder myBuf; public PsiExpressionTrimRenderer(final StringBuilder buf) { myBuf = buf; } @Override public void visitExpression(final PsiExpression expression) { myBuf.append(expression.getText()); } @Override public void visitInstanceOfExpression(final PsiInstanceOfExpression expression) { expression.getOperand().accept(this); myBuf.append(" ").append(PsiKeyword.INSTANCEOF).append(" "); final PsiTypeElement checkType = expression.getCheckType(); if (checkType != null) { myBuf.append(checkType.getText()); } } @Override public void visitParenthesizedExpression(final PsiParenthesizedExpression expression) { myBuf.append("("); final PsiExpression expr = expression.getExpression(); if (expr != null) { expr.accept(this); } myBuf.append(")"); } @Override public void visitTypeCastExpression(final PsiTypeCastExpression expression) { final PsiTypeElement castType = expression.getCastType(); if (castType != null) { myBuf.append("(").append(castType.getText()).append(")"); } final PsiExpression operand = expression.getOperand(); if (operand != null) { operand.accept(this); } } @Override public void visitArrayAccessExpression(final PsiArrayAccessExpression expression) { expression.getArrayExpression().accept(this); myBuf.append("["); final PsiExpression indexExpression = expression.getIndexExpression(); if (indexExpression != null) { indexExpression.accept(this); } myBuf.append("]"); } @Override public void visitPrefixExpression(final PsiPrefixExpression expression) { myBuf.append(expression.getOperationSign().getText()); final PsiExpression operand = expression.getOperand(); if (operand != null) { operand.accept(this); } } @Override public void visitPostfixExpression(final PsiPostfixExpression expression) { expression.getOperand().accept(this); myBuf.append(expression.getOperationSign().getText()); } @Override public void visitPolyadicExpression(PsiPolyadicExpression expression) { PsiExpression[] operands = expression.getOperands(); for (int i = 0; i < operands.length; i++) { PsiExpression operand = operands[i]; if (i != 0) { PsiJavaToken token = expression.getTokenBeforeOperand(operand); myBuf.append(" ").append(token.getText()).append(" "); } operand.accept(this); } } @Override public void visitConditionalExpression(final PsiConditionalExpression expression) { expression.getCondition().accept(this); myBuf.append(" ? "); final PsiExpression thenExpression = expression.getThenExpression(); if (thenExpression != null) { thenExpression.accept(this); } myBuf.append(" : "); final PsiExpression elseExpression = expression.getElseExpression(); if (elseExpression != null) { elseExpression.accept(this); } } @Override public void visitAssignmentExpression(final PsiAssignmentExpression expression) { expression.getLExpression().accept(this); myBuf.append(expression.getOperationSign().getText()); final PsiExpression rExpression = expression.getRExpression(); if (rExpression != null) { rExpression.accept(this); } } @Override public void visitReferenceExpression(final PsiReferenceExpression expr) { final PsiExpression qualifierExpression = expr.getQualifierExpression(); if (qualifierExpression != null) { qualifierExpression.accept(this); myBuf.append("."); } myBuf.append(expr.getReferenceName()); } @Override public void visitMethodCallExpression(final PsiMethodCallExpression expr) { expr.getMethodExpression().accept(this); expr.getArgumentList().accept(this); } @Override public void visitArrayInitializerExpression(final PsiArrayInitializerExpression expression) { myBuf.append("{"); boolean first = true; for (PsiExpression expr : expression.getInitializers()) { if (!first) { myBuf.append(", "); } first = false; expr.accept(this); } myBuf.append("}"); } @Override public void visitExpressionList(final PsiExpressionList list) { final PsiExpression[] args = list.getExpressions(); if (args.length > 0) { myBuf.append("(...)"); } else { myBuf.append("()"); } } @Override public void visitNewExpression(final PsiNewExpression expr) { final PsiAnonymousClass anonymousClass = expr.getAnonymousClass(); final PsiExpressionList argumentList = expr.getArgumentList(); if (anonymousClass != null) { myBuf.append(PsiKeyword.NEW).append(" ").append(anonymousClass.getBaseClassType().getPresentableText()); if (argumentList != null) argumentList.accept(this); myBuf.append(" {...}"); } else { final PsiJavaCodeReferenceElement reference = expr.getClassReference(); if (reference != null) { myBuf.append(PsiKeyword.NEW).append(" ").append(reference.getText()); final PsiExpression[] arrayDimensions = expr.getArrayDimensions(); final PsiType type = expr.getType(); final int dimensions = type != null ? type.getArrayDimensions() : arrayDimensions.length; if (arrayDimensions.length > 0) myBuf.append("["); for (int i = 0, arrayDimensionsLength = arrayDimensions.length; i < dimensions; i++) { final PsiExpression dimension = i < arrayDimensionsLength ? arrayDimensions[i] : null; if (i > 0) myBuf.append("]["); if (dimension != null) { dimension.accept(this); } } if (arrayDimensions.length > 0) myBuf.append("]"); if (argumentList != null) { argumentList.accept(this); } final PsiArrayInitializerExpression arrayInitializer = expr.getArrayInitializer(); if (arrayInitializer != null) { arrayInitializer.accept(this); } } else { myBuf.append(expr.getText()); } } } public static class RenderFunction implements Function<PsiExpression, String> { @Override public String fun(PsiExpression psiExpression) { return render(psiExpression); } } public static String render(PsiExpression expression) { StringBuilder buf = new StringBuilder(); expression.accept(new PsiExpressionTrimRenderer(buf)); return buf.toString(); } }