/* * Copyright 2000-2016 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. */ package org.jetbrains.plugins.groovy.refactoring.inline; import com.intellij.lang.findUsages.DescriptiveNameUtil; import com.intellij.lang.refactoring.InlineHandler; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMember; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.usageView.UsageViewUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.util.GrVariableDeclarationOwner; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; /** * @author ilyas */ public class GroovyInlineHandler implements InlineHandler { @Override @Nullable public Settings prepareInlineElement(@NotNull final PsiElement element, @Nullable Editor editor, boolean invokedOnReference) { if (element instanceof GrField) { return GrInlineFieldUtil.inlineFieldSettings((GrField)element, editor, invokedOnReference); } else if (element instanceof GrMethod) { return GroovyInlineMethodUtil.inlineMethodSettings((GrMethod)element, editor, invokedOnReference); } else { if (element instanceof GrTypeDefinition) { return null; //todo inline to anonymous class, push members from super class } } if (element instanceof PsiMember) { String message = GroovyRefactoringBundle.message("cannot.inline.0.", getFullName(element)); CommonRefactoringUtil.showErrorHint(element.getProject(), editor, message, "", HelpID.INLINE_FIELD); return InlineHandler.Settings.CANNOT_INLINE_SETTINGS; } return null; } private static String getFullName(PsiElement psi) { final String name = DescriptiveNameUtil.getDescriptiveName(psi); return (UsageViewUtil.getType(psi) + " " + name).trim(); } @Override public void removeDefinition(@NotNull PsiElement element, @NotNull Settings settings) { final PsiElement owner = element.getParent().getParent(); if (element instanceof GrVariable && owner instanceof GrVariableDeclarationOwner) { ((GrVariableDeclarationOwner)owner).removeVariable(((GrVariable)element)); } if (element instanceof GrMethod) { element.delete(); } } @Override @Nullable public Inliner createInliner(@NotNull PsiElement element, @NotNull Settings settings) { if (element instanceof GrVariable) { return new GrVariableInliner((GrVariable)element, settings); } if (element instanceof GrMethod) { return new GroovyMethodInliner((GrMethod)element); } return null; } }