/* * 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); } }