/*
 * Copyright 2011-2013 Bas Leijdekkers
 *
 * 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.
 */
package com.siyeh.ipp.braces;

import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.IntentionPowerPackBundle;
import com.siyeh.ipp.base.MutablyNamedIntention;
import com.siyeh.ipp.base.PsiElementPredicate;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

public class AddArrayCreationExpressionIntention extends MutablyNamedIntention {

  @Override
  @NotNull
  protected PsiElementPredicate getElementPredicate() {
    return new ArrayCreationExpressionPredicate();
  }

  @Override
  protected String getTextForElement(PsiElement element) {
    final PsiArrayInitializerExpression arrayInitializerExpression = (PsiArrayInitializerExpression)element;
    final PsiType type = arrayInitializerExpression.getType();
    final StringBuilder typeText = buildTypeText(type, new StringBuilder());
    return IntentionPowerPackBundle.message("add.array.creation.expression.intention.name", typeText.toString());
  }

  @Override
  protected void processIntention(@NotNull PsiElement element)
    throws IncorrectOperationException {
    final PsiArrayInitializerExpression arrayInitializerExpression =
      (PsiArrayInitializerExpression)element;
    final PsiType type = arrayInitializerExpression.getType();
    if (type == null) {
      return;
    }
    @NonNls final StringBuilder text = new StringBuilder();
    text.append("new ");
    buildTypeText(type, text);
    text.append(arrayInitializerExpression.getText());
    replaceExpression(text.toString(), arrayInitializerExpression);
  }

  private static StringBuilder buildTypeText(PsiType type, StringBuilder typeText) {
    if (type instanceof PsiArrayType) {
      final PsiArrayType arrayType = (PsiArrayType)type;
      buildTypeText(arrayType.getComponentType(), typeText);
      typeText.append("[]");
    }
    else if (type instanceof PsiClassType) {
      final PsiClassType classType = (PsiClassType)type;
      typeText.append(classType.getClassName()); // no parameters -> no generic array creation
    }
    else {
      typeText.append(type.getCanonicalText());
    }
    return typeText;
  }
}

@@ -651,16 +651,65 @@
 .psi.*;%0A
+import com.intellij.psi.util.TypeConversionUtil;%0A
 import c
@@ -1441,85 +1441,8 @@
 ();%0A
-    final StringBuilder typeText = buildTypeText(type, new StringBuilder());%0A
     
@@ -1532,26 +1532,102 @@
 me%22,
- typeText.toString
+%0A                                            TypeConversionUtil.erasure(type).getCanonicalText
 ());
@@ -1706,20 +1706,16 @@
 element)
-%0A   
  throws 
@@ -1812,22 +1812,16 @@
 ession =
-%0A     
  (PsiArr
@@ -1968,813 +1968,176 @@
     
-@NonNls final StringBuilder text = new StringBuilder();%0A    text.append(%22new %22);%0A    buildTypeText(type, text);%0A    text.append(arrayInitializerExpression.getText());%0A    replaceExpression(text.toString(), arrayInitializerExpression);%0A  %7D%0A%0A  private static StringBuilder buildTypeText(PsiType type, StringBuilder type
+replaceExpression(%22new %22 + TypeConversionUtil.erasure(type).getCanonicalText() + arrayInitializerExpression.get
 Text
-) %7B
+(),
 %0A    
-if (type instanceof PsiArrayType) %7B%0A      final PsiArrayType arrayType = (PsiArrayType)type;%0A      buildTypeText(arrayType.getComponentType(), typeText);%0A      typeText.append(%22%5B%5D%22);%0A    %7D%0A    else if (type instanceof PsiClassType) %7B%0A      final PsiClassType classType = (PsiClassType)type;%0A      typeText.append(classType.getClassName()); // no parameters -%3E no generic array creation%0A    %7D%0A    else %7B%0A      typeText.append(type.getCanonicalText());%0A    %7D%0A    return typeText
+                  arrayInitializerExpression)
 ;%0A  

use TypeConversionUtil.erasure() instead of reinventing the wheel badly