Package com.intellij.plugins.haxe.ide.refactoring.introduceField

Source Code of com.intellij.plugins.haxe.ide.refactoring.introduceField.HaxeIntroduceConstantHandler$InitializerTextBuilder

/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2014-2014 AS3Boyan
* Copyright 2014-2014 Elias Ku
*
* 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.intellij.plugins.haxe.ide.refactoring.introduceField;

import com.intellij.openapi.project.Project;
import com.intellij.plugins.haxe.ide.refactoring.introduce.HaxeIntroduceHandler;
import com.intellij.plugins.haxe.ide.refactoring.introduce.HaxeIntroduceOperation;
import com.intellij.plugins.haxe.lang.psi.HaxeClass;
import com.intellij.plugins.haxe.lang.psi.HaxeClassBody;
import com.intellij.plugins.haxe.lang.psi.HaxeExpression;
import com.intellij.plugins.haxe.lang.psi.HaxeVarDeclaration;
import com.intellij.plugins.haxe.util.HaxeElementGenerator;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiRecursiveElementVisitor;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

/**
* Created by as3boyan on 12.09.14.
*/
public class HaxeIntroduceConstantHandler extends HaxeIntroduceHandler {

  public HaxeIntroduceConstantHandler() {
    super("Introduce Constant");
  }

  @Override
  protected PsiElement addDeclaration(@NotNull final PsiElement expression,
                                      @NotNull final PsiElement declaration,
                                      @NotNull HaxeIntroduceOperation operation) {
    return doIntroduceVariable(expression, declaration, operation.getOccurrences(), operation.isReplaceAll());
  }

  public static PsiElement doIntroduceVariable(PsiElement expression,
                                               PsiElement declaration,
                                               List<PsiElement> occurrences,
                                               boolean replaceAll) {
    //PsiElement anchor = replaceAll ? findAnchor(occurrences) : findAnchor(expression);
    //assert anchor != null;
    //final PsiElement parent = anchor.getParent();
    //return parent.addBefore(declaration, anchor);
    HaxeClass haxeClass = PsiTreeUtil.getParentOfType(expression, HaxeClass.class, false);
    if (haxeClass != null) {
      //haxeClass.getVarDeclarations().get(0)
      HaxeClassBody classBody = PsiTreeUtil.getChildOfType(haxeClass, HaxeClassBody.class);

      if (classBody != null) {
        PsiElement child = classBody.getFirstChild();

        if (child != null) {
          return classBody.addBefore(declaration, child);
        }
        else {
          classBody.add(declaration);
        }
      }
    }

    return null;
  }

  @Nullable
  @Override
  public PsiElement createDeclaration(HaxeIntroduceOperation operation) {
    final Project project = operation.getProject();
    final HaxeExpression initializer = operation.getInitializer();
    InitializerTextBuilder builder = new InitializerTextBuilder();
    initializer.accept(builder);
    String assignmentText = "public static inline var " + operation.getName() + " = " + builder.result() + ";";
    PsiElement anchor = operation.isReplaceAll()
                        ? findAnchor(operation.getOccurrences())
                        : findAnchor(initializer);
    return createDeclaration(project, assignmentText, anchor);
  }

  private static class InitializerTextBuilder extends PsiRecursiveElementVisitor {
    private final StringBuilder myResult = new StringBuilder();

    @Override
    public void visitWhiteSpace(PsiWhiteSpace space) {
      myResult.append(space.getText().replace('\n', ' '));
    }

    @Override
    public void visitElement(PsiElement element) {
      if (element.getChildren().length == 0) {
        myResult.append(element.getText());
      }
      else {
        super.visitElement(element);
      }
    }

    public String result() {
      return myResult.toString();
    }
  }

  @Nullable
  @Override
  protected HaxeVarDeclaration createDeclaration(Project project, String text, PsiElement anchor) {
    return HaxeElementGenerator.createVarDeclaration(project, text);
  }
}
TOP

Related Classes of com.intellij.plugins.haxe.ide.refactoring.introduceField.HaxeIntroduceConstantHandler$InitializerTextBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.