c.s.tools.ide.analysis.modernize/src/com/sun/tools/ide/analysis/modernize/impl/ModernizeFix.java
author Ilia Gromov <ilia@netbeans.org>
Wed, 07 Jun 2017 20:23:29 +0300
branchrelease82
changeset 18423 b9d9af239a0c
permissions -rw-r--r--
Fixing #270763 - Move clang-tidy integration to nb contrib
* * *
Fixing #270763 - Move clang-tidy integration to nb contrib - move wrapper
* * *
Fixing #270763 - Move clang-tidy integration to nb contrib - sign nbm
* * *
Fixing #270763 - Move clang-tidy integration to nb contrib - move tests
* * *
Fixing #270763 - Move clang-tidy integration to nb contrib - data for a new test
* * *
Fixed #270839 - [clang-tidy] Group checks in Editor hints
(transplanted from 35b6125ef00c470655dac6673075f5c12ec74593)
ilia@18415
     1
/*
ilia@18415
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
ilia@18415
     3
 *
ilia@18415
     4
 * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
ilia@18415
     5
 *
ilia@18415
     6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
ilia@18415
     7
 * Other names may be trademarks of their respective owners.
ilia@18415
     8
 *
ilia@18415
     9
 * The contents of this file are subject to the terms of either the GNU
ilia@18415
    10
 * General Public License Version 2 only ("GPL") or the Common
ilia@18415
    11
 * Development and Distribution License("CDDL") (collectively, the
ilia@18415
    12
 * "License"). You may not use this file except in compliance with the
ilia@18415
    13
 * License. You can obtain a copy of the License at
ilia@18415
    14
 * http://www.netbeans.org/cddl-gplv2.html
ilia@18415
    15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
ilia@18415
    16
 * specific language governing permissions and limitations under the
ilia@18415
    17
 * License.  When distributing the software, include this License Header
ilia@18415
    18
 * Notice in each file and include the License file at
ilia@18415
    19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
ilia@18415
    20
 * particular file as subject to the "Classpath" exception as provided
ilia@18415
    21
 * by Oracle in the GPL Version 2 section of the License file that
ilia@18415
    22
 * accompanied this code. If applicable, add the following below the
ilia@18415
    23
 * License Header, with the fields enclosed by brackets [] replaced by
ilia@18415
    24
 * your own identifying information:
ilia@18415
    25
 * "Portions Copyrighted [year] [name of copyright owner]"
ilia@18415
    26
 *
ilia@18415
    27
 * If you wish your version of this file to be governed by only the CDDL
ilia@18415
    28
 * or only the GPL Version 2, indicate your decision by adding
ilia@18415
    29
 * "[Contributor] elects to include this software in this distribution
ilia@18415
    30
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
ilia@18415
    31
 * single choice of license, a recipient has the option to distribute
ilia@18415
    32
 * your version of this file under either the CDDL, the GPL Version 2 or
ilia@18415
    33
 * to extend the choice of license to its licensees as provided above.
ilia@18415
    34
 * However, if you add GPL Version 2 code and therefore, elected the GPL
ilia@18415
    35
 * Version 2 license, then the option applies only if the new code is
ilia@18415
    36
 * made subject to such option by the copyright holder.
ilia@18415
    37
 *
ilia@18415
    38
 * Contributor(s): Ilia Gromov
ilia@18415
    39
 */
ilia@18415
    40
package com.sun.tools.ide.analysis.modernize.impl;
ilia@18415
    41
ilia@18415
    42
import java.io.File;
ilia@18415
    43
import java.util.List;
ilia@18415
    44
import javax.swing.text.Document;
ilia@18415
    45
import javax.swing.text.Position;
ilia@18415
    46
import org.netbeans.editor.BaseDocument;
ilia@18415
    47
import org.netbeans.modules.cnd.api.model.CsmFile;
ilia@18415
    48
import org.netbeans.modules.cnd.modelutil.CsmUtilities;
ilia@18415
    49
import org.netbeans.spi.editor.hints.ChangeInfo;
ilia@18415
    50
import org.netbeans.spi.editor.hints.EnhancedFix;
ilia@18415
    51
import org.openide.filesystems.FileObject;
ilia@18415
    52
import org.openide.filesystems.FileUtil;
ilia@18415
    53
import org.openide.text.CloneableEditorSupport;
ilia@18415
    54
import org.openide.text.PositionRef;
ilia@18415
    55
ilia@18415
    56
/**
ilia@18415
    57
 *
ilia@18415
    58
 * @author Ilia Gromov
ilia@18415
    59
 */
ilia@18415
    60
public class ModernizeFix implements EnhancedFix {
ilia@18415
    61
    
ilia@18415
    62
    private final YamlParser.Replacement[] replacements;
ilia@18415
    63
    private final String text;
ilia@18415
    64
    private CloneableEditorSupport ces;
ilia@18415
    65
    private final PositionRef[] beg;
ilia@18415
    66
    private final PositionRef[] end;
ilia@18415
    67
ilia@18415
    68
    public ModernizeFix(List<YamlParser.Replacement> replacementList, String id) {
ilia@18415
    69
        this.beg = new PositionRef[replacementList.size()];
ilia@18415
    70
        this.end = new PositionRef[replacementList.size()];
ilia@18415
    71
        this.replacements = replacementList.toArray(new YamlParser.Replacement[replacementList.size()]);
ilia@18415
    72
        this.text = (id.startsWith("-")) ? id.substring(1) : id; //NOI18N
ilia@18415
    73
        for (int i = 0; i < replacements.length; i++) {
ilia@18415
    74
            YamlParser.Replacement replacement = replacements[i];
ilia@18415
    75
            FileObject fo = FileUtil.toFileObject(new File(replacement.filePath));
ilia@18415
    76
            CsmFile csmFile = CsmUtilities.getCsmFile(fo, false, false);
ilia@18415
    77
            if (csmFile != null) {
ilia@18415
    78
                ces = CsmUtilities.findCloneableEditorSupport(csmFile);
ilia@18415
    79
                if (ces != null) {
ilia@18415
    80
                    beg[i] = ces.createPositionRef(replacement.offset, Position.Bias.Forward);
ilia@18415
    81
                    end[i] = ces.createPositionRef(replacement.offset + replacement.length, Position.Bias.Backward);
ilia@18415
    82
                } else {
ilia@18415
    83
                }
ilia@18415
    84
            }
ilia@18415
    85
        }
ilia@18415
    86
    } //NOI18N
ilia@18415
    87
ilia@18415
    88
    @Override
ilia@18415
    89
    public String getText() {
ilia@18415
    90
        return "Apply replacement - " + text; //NOI18N
ilia@18415
    91
    }
ilia@18415
    92
ilia@18415
    93
    @Override
ilia@18415
    94
    public ChangeInfo implement() throws Exception {
ilia@18415
    95
        Document doc = CsmUtilities.openDocument(ces);
ilia@18415
    96
        if (doc instanceof BaseDocument) {
ilia@18415
    97
            Position min = beg[0];
ilia@18415
    98
            Position max = end[0];
ilia@18415
    99
            for (int i = 0; i < replacements.length; i++) {
ilia@18415
   100
                YamlParser.Replacement replacement = replacements[i];
ilia@18415
   101
                PositionRef b = beg[i];
ilia@18415
   102
                PositionRef e = end[i];
ilia@18415
   103
                if (b != null && e != null) {
ilia@18415
   104
                    int newBeg = b.getOffset();
ilia@18415
   105
                    int newLength = e.getOffset() - b.getOffset();
ilia@18415
   106
                    if (b.getOffset() < min.getOffset()) {
ilia@18415
   107
                        min = b;
ilia@18415
   108
                    }
ilia@18415
   109
                    if (e.getOffset() > max.getOffset()) {
ilia@18415
   110
                        max = e;
ilia@18415
   111
                    }
ilia@18415
   112
                    if (newLength < 1) {
ilia@18415
   113
                        // TODO: temp fix
ilia@18415
   114
                        newLength = 0;
ilia@18415
   115
                    }
ilia@18415
   116
                    ((BaseDocument) doc).replace(newBeg, newLength, replacement.replacementText, null);
ilia@18415
   117
                }
ilia@18415
   118
            }
ilia@18415
   119
            return new ChangeInfo(min, max);
ilia@18415
   120
        }
ilia@18415
   121
        return null;
ilia@18415
   122
    }
ilia@18415
   123
ilia@18415
   124
    @Override
ilia@18415
   125
    public CharSequence getSortText() {
ilia@18415
   126
        return Integer.toString(Integer.MIN_VALUE);
ilia@18415
   127
    }
ilia@18415
   128
ilia@18415
   129
    public YamlParser.Replacement[] getReplacements() {
ilia@18415
   130
        return replacements;
ilia@18415
   131
    }
ilia@18415
   132
    
ilia@18415
   133
}