ide.analysis.modernize/src/org/netbeans/modules/ide/analysis/modernize/options/ClangAnalyzerOptions.java
author Ilia Gromov <ilia@netbeans.org>
Wed, 07 Jun 2017 18:50:35 +0300
branchrelease82
changeset 18422 0bdf8b66a76b
parent 18403 67d78b11d2e0
permissions -rw-r--r--
Fixing #270763 - Move clang-tidy integration to nb contrib
(transplanted from a225e57384a7fe82b6fb8ae18f5aa52e2350ce5a)
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * If you wish your version of this file to be governed by only the CDDL
    28  * or only the GPL Version 2, indicate your decision by adding
    29  * "[Contributor] elects to include this software in this distribution
    30  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    31  * single choice of license, a recipient has the option to distribute
    32  * your version of this file under either the CDDL, the GPL Version 2 or
    33  * to extend the choice of license to its licensees as provided above.
    34  * However, if you add GPL Version 2 code and therefore, elected the GPL
    35  * Version 2 license, then the option applies only if the new code is
    36  * made subject to such option by the copyright holder.
    37  *
    38  * Contributor(s): Ilia Gromov
    39  */
    40 
    41 package org.netbeans.modules.ide.analysis.modernize.options;
    42 
    43 import java.io.File;
    44 import java.io.IOException;
    45 import java.util.Collections;
    46 import org.netbeans.modules.nativeexecution.api.ExecutionEnvironmentFactory;
    47 import org.netbeans.modules.nativeexecution.api.HostInfo;
    48 import org.netbeans.modules.nativeexecution.api.util.ConnectionManager;
    49 import org.netbeans.modules.nativeexecution.api.util.HostInfoUtils;
    50 import org.openide.modules.InstalledFileLocator;
    51 
    52 /**
    53  *
    54  * @author Ilia Gromov
    55  */
    56 public class ClangAnalyzerOptions {
    57 
    58     public static final String CLANG_BINARY_NAME = "clang-tidy"; //NOI18N
    59     public static final String CLANG_BINARY_PATH = "clang-tidy-path"; //NOI18N
    60 
    61     private static String findInPaths() {
    62         String binaryName = CLANG_BINARY_NAME + "-" + getCodeBase(); //NOI18N
    63         String result = HostInfoUtils.searchFile(ExecutionEnvironmentFactory.getLocal(), Collections.<String>emptyList(), binaryName, true); // NOI18N
    64         return result;
    65     }
    66 
    67     public static String getClangAnalyzerPath() {
    68         String result = AnalyzerPreferences.getPreferences().get(CLANG_BINARY_PATH, ""); //NOI18N
    69         String oldValue = result;
    70         if (result.isEmpty()) {
    71             String toolPath = System.getProperty("devstudio.clangtidy.path"); //NOI18N
    72             if (toolPath != null) {
    73                 result = toolPath;
    74             }
    75         }
    76         if (result.isEmpty()) {
    77             final String codeBase = getCodeBase();
    78             String relativePath = String.format("%s/%s-%s", CLANG_BINARY_NAME, CLANG_BINARY_NAME, codeBase); //NOI18N
    79             File toolFile = InstalledFileLocator.getDefault().locate(relativePath, codeBase, false);
    80             if (toolFile != null && toolFile.exists()) {
    81                 toolFile.setExecutable(true);
    82                 System.out.println(toolFile.canExecute());
    83                 result = toolFile.getAbsolutePath();
    84             }
    85         }
    86         if (result.isEmpty()) {
    87             String toolPath = findInPaths();
    88             if (toolPath != null) {
    89                 result = toolPath;
    90             }
    91         }
    92         if (result.isEmpty()) {
    93             return null;
    94         } else {
    95             if (!oldValue.equals(result)) {
    96                 AnalyzerPreferences.getPreferences().put(CLANG_BINARY_PATH, result);
    97             }
    98         }
    99         return result;
   100     }
   101 
   102     public static String getMissingModuleName() {
   103         return "org.netbeans.modules.analysis.clangtidy." + getCodeBase(); //NOI18N
   104     }
   105 
   106     public static String getCodeBase() {
   107         HostInfo hostInfo = null;
   108         try {
   109             hostInfo = HostInfoUtils.getHostInfo(ExecutionEnvironmentFactory.getLocal());
   110         } catch (IOException ex) {
   111             ex.printStackTrace(System.err);
   112         } catch (ConnectionManager.CancellationException ex) {
   113             ex.printStackTrace(System.err);
   114         }
   115         String module = null;
   116         if (hostInfo != null) {
   117             switch (hostInfo.getOS().getFamily()) {
   118                 case SUNOS:
   119                     switch (hostInfo.getCpuFamily()) {
   120                         case X86:
   121                             switch (hostInfo.getOS().getBitness()) {
   122                                 case _32:
   123                                     module = "SunOS_x86"; // NOI18N
   124                                     break;
   125                                 case _64:
   126                                     module = "SunOS_x86_64"; // NOI18N
   127                                     break;
   128                             }
   129                             break;
   130                         case SPARC:
   131                             module = "SunOS_sparc"; // NOI18N
   132                             break;
   133                     }
   134                     break;
   135                 case LINUX:
   136                     switch (hostInfo.getOS().getBitness()) {
   137                         case _32:
   138                             module = "Linux_x86"; // NOI18N
   139                             break;
   140                         case _64:
   141                             module = "Linux_x86_64"; // NOI18N
   142                             break;
   143                     }
   144                     break;
   145                 case WINDOWS:
   146                     switch (hostInfo.getOS().getBitness()) {
   147                         case _32:
   148                             module = "Windows_x86"; // NOI18N
   149                             break;
   150                         case _64:
   151                             module = "Windows_x86_64"; // NOI18N
   152                             break;
   153                     }
   154                     break;
   155                 case MACOSX:
   156                     switch (hostInfo.getOS().getBitness()) {
   157                         case _32:
   158                             module = "MacOSX_x86"; // NOI18N
   159                             break;
   160                         case _64:
   161                             module = "MacOSX_x86_64"; // NOI18N
   162                             break;
   163                     }
   164                     break;
   165             }
   166         }
   167         return module;
   168     }
   169 }