Search in sources :

Example 6 with TypeMigrationRules

use of com.intellij.refactoring.typeMigration.TypeMigrationRules in project intellij-community by JetBrains.

the class TypeMigrationTestBase method performAction.

private void performAction(String className, String rootDir, RulesProvider provider) throws Exception {
    PsiClass aClass = myJavaFacade.findClass(className, GlobalSearchScope.allScope(getProject()));
    assertNotNull("Class " + className + " not found", aClass);
    final PsiElement[] migrationElements = provider.victims(aClass);
    final PsiType migrationType = provider.migrationType(migrationElements[0]);
    final TypeMigrationRules rules = new TypeMigrationRules();
    rules.setBoundScope(new LocalSearchScope(aClass.getContainingFile()));
    final TestTypeMigrationProcessor pr = new TestTypeMigrationProcessor(getProject(), migrationElements, migrationType, rules);
    final UsageInfo[] usages = pr.findUsages();
    final String report = pr.getLabeler().getMigrationReport();
    WriteCommandAction.runWriteCommandAction(null, () -> pr.performRefactoring(usages));
    String itemName = className + ".items";
    String patternName = getTestDataPath() + getTestRoot() + getTestName(true) + "/after/" + itemName;
    File patternFile = new File(patternName);
    if (!patternFile.exists()) {
        PrintWriter writer = new PrintWriter(new FileOutputStream(patternFile));
        try {
            writer.print(report);
            writer.close();
        } finally {
            writer.close();
        }
        System.out.println("Pattern not found, file " + patternName + " created.");
        LocalFileSystem.getInstance().refreshAndFindFileByIoFile(patternFile);
    }
    File graFile = new File(FileUtil.getTempDirectory() + File.separator + rootDir + File.separator + itemName);
    PrintWriter writer = new PrintWriter(new FileOutputStream(graFile));
    try {
        writer.print(report);
        writer.close();
    } finally {
        writer.close();
    }
    LocalFileSystem.getInstance().refreshAndFindFileByIoFile(graFile);
    FileDocumentManager.getInstance().saveAllDocuments();
}
Also used : TypeMigrationRules(com.intellij.refactoring.typeMigration.TypeMigrationRules) LocalSearchScope(com.intellij.psi.search.LocalSearchScope) FileOutputStream(java.io.FileOutputStream) VirtualFile(com.intellij.openapi.vfs.VirtualFile) File(java.io.File) UsageInfo(com.intellij.usageView.UsageInfo) PrintWriter(java.io.PrintWriter)

Example 7 with TypeMigrationRules

use of com.intellij.refactoring.typeMigration.TypeMigrationRules in project intellij-community by JetBrains.

the class ExtractEnumProcessor method findEnumConstantUsages.

public List<FixableUsageInfo> findEnumConstantUsages(List<FixableUsageInfo> fieldUsages) {
    final List<FixableUsageInfo> result = new ArrayList<>();
    if (!myEnumConstants.isEmpty()) {
        final Set<PsiSwitchStatement> switchStatements = new HashSet<>();
        for (UsageInfo usage : fieldUsages) {
            if (usage instanceof ReplaceStaticVariableAccess) {
                final PsiElement element = usage.getElement();
                final PsiSwitchStatement switchStatement = PsiTreeUtil.getParentOfType(element, PsiSwitchStatement.class);
                if (switchStatement != null) {
                    switchStatements.add(switchStatement);
                }
            }
        }
        final PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(myProject).getConstantEvaluationHelper();
        final Set<Object> enumValues = new HashSet<>();
        for (PsiField enumConstant : myEnumConstants) {
            enumValues.add(evaluationHelper.computeConstantExpression(enumConstant.getInitializer()));
        }
        final PsiType enumValueType = myEnumConstants.get(0).getType();
        for (PsiSwitchStatement switchStatement : switchStatements) {
            final PsiStatement errStatement = EnumConstantsUtil.isEnumSwitch(switchStatement, enumValueType, enumValues);
            if (errStatement != null) {
                String description = null;
                if (errStatement instanceof PsiSwitchLabelStatement) {
                    final PsiExpression caseValue = ((PsiSwitchLabelStatement) errStatement).getCaseValue();
                    if (caseValue != null) {
                        description = caseValue.getText() + " can not be replaced with enum";
                    }
                }
                result.add(new ConflictUsageInfo(errStatement, description));
            } else {
                final PsiExpression expression = switchStatement.getExpression();
                if (expression instanceof PsiReferenceExpression) {
                    final PsiElement element = ((PsiReferenceExpression) expression).resolve();
                    if (element != null) {
                        if (!element.getManager().isInProject(element)) {
                            result.add(new ConflictUsageInfo(expression, StringUtil.capitalize(RefactoringUIUtil.getDescription(element, false)) + " is out of project"));
                        }
                    }
                } else {
                    result.add(new ConflictUsageInfo(expression, null));
                }
            }
        }
        final TypeMigrationRules rules = new TypeMigrationRules();
        rules.addConversionDescriptor(new EnumTypeConversionRule(myEnumConstants));
        rules.setBoundScope(GlobalSearchScope.projectScope(myProject));
        myTypeMigrationProcessor = new TypeMigrationProcessor(myProject, PsiUtilCore.toPsiElementArray(myEnumConstants), Functions.<PsiElement, PsiType>constant(JavaPsiFacade.getElementFactory(myProject).createType(myClass)), rules);
        for (UsageInfo usageInfo : myTypeMigrationProcessor.findUsages()) {
            final PsiElement migrateElement = usageInfo.getElement();
            if (migrateElement instanceof PsiField) {
                final PsiField enumConstantField = (PsiField) migrateElement;
                if (enumConstantField.hasModifierProperty(PsiModifier.STATIC) && enumConstantField.hasModifierProperty(PsiModifier.FINAL) && enumConstantField.hasInitializer() && !myEnumConstants.contains(enumConstantField)) {
                    continue;
                }
            }
            result.add(new EnumTypeMigrationUsageInfo(usageInfo));
        }
    }
    return result;
}
Also used : TypeMigrationRules(com.intellij.refactoring.typeMigration.TypeMigrationRules) FixableUsageInfo(com.intellij.refactoring.util.FixableUsageInfo) ReplaceStaticVariableAccess(com.intellij.refactoring.extractclass.usageInfo.ReplaceStaticVariableAccess) TypeMigrationProcessor(com.intellij.refactoring.typeMigration.TypeMigrationProcessor) UsageInfo(com.intellij.usageView.UsageInfo) FixableUsageInfo(com.intellij.refactoring.util.FixableUsageInfo)

Aggregations

TypeMigrationRules (com.intellij.refactoring.typeMigration.TypeMigrationRules)7 LocalSearchScope (com.intellij.psi.search.LocalSearchScope)3 TypeMigrationProcessor (com.intellij.refactoring.typeMigration.TypeMigrationProcessor)3 UsageInfo (com.intellij.usageView.UsageInfo)2 TypeExpression (com.intellij.codeInsight.intention.impl.TypeExpression)1 TemplateState (com.intellij.codeInsight.template.impl.TemplateState)1 LocalQuickFixAndIntentionActionOnPsiElement (com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement)1 Document (com.intellij.openapi.editor.Document)1 TextRange (com.intellij.openapi.util.TextRange)1 VirtualFile (com.intellij.openapi.vfs.VirtualFile)1 PsiImmediateClassType (com.intellij.psi.impl.source.PsiImmediateClassType)1 ReplaceStaticVariableAccess (com.intellij.refactoring.extractclass.usageInfo.ReplaceStaticVariableAccess)1 FixableUsageInfo (com.intellij.refactoring.util.FixableUsageInfo)1 IncorrectOperationException (com.intellij.util.IncorrectOperationException)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 PrintWriter (java.io.PrintWriter)1