c.s.tools.ide.analysis.modernize/src/com/sun/tools/ide/analysis/modernize/utils/AnalyticsTools.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)
     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 package com.sun.tools.ide.analysis.modernize.utils;
    41 
    42 import com.sun.tools.ide.analysis.modernize.impl.ModernizeErrorProvider;
    43 import java.util.ArrayList;
    44 import java.util.List;
    45 import org.netbeans.api.project.FileOwnerQuery;
    46 import org.netbeans.api.project.Project;
    47 import org.netbeans.modules.analysis.spi.Analyzer;
    48 import org.netbeans.modules.cnd.analysis.api.AnalyzerResponse;
    49 import org.netbeans.modules.cnd.api.model.CsmFile;
    50 import org.netbeans.modules.cnd.api.model.syntaxerr.CsmErrorInfo;
    51 import org.netbeans.modules.cnd.api.model.syntaxerr.CsmErrorProvider;
    52 import org.netbeans.modules.cnd.api.project.NativeFileItem;
    53 import org.netbeans.modules.cnd.api.remote.RemoteProject;
    54 import org.netbeans.modules.cnd.api.toolchain.CompilerSet;
    55 import org.netbeans.modules.cnd.api.toolchain.PredefinedToolKind;
    56 import org.netbeans.modules.cnd.api.toolchain.Tool;
    57 import org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptorProvider;
    58 import org.netbeans.modules.cnd.makeproject.api.configurations.Item;
    59 import org.netbeans.modules.cnd.makeproject.api.configurations.MakeConfigurationDescriptor;
    60 import org.netbeans.modules.cnd.spi.toolchain.ToolchainProject;
    61 import org.netbeans.modules.cnd.utils.MIMENames;
    62 import org.netbeans.modules.nativeexecution.api.ExecutionEnvironment;
    63 import org.openide.filesystems.FileObject;
    64 import org.openide.util.Lookup;
    65 
    66 /**
    67  *
    68  * @author Ilia Gromov
    69  */
    70 public class AnalyticsTools {
    71 
    72     public static ExecutionEnvironment detectEnvironment(Analyzer.Context context) {
    73         if (context.getScope() == null) {
    74             return null;
    75         }
    76         for (FileObject fo : context.getScope().getFiles()) {
    77             String mimeType = fo.getMIMEType();
    78             if (MIMENames.isHeaderOrCppOrC(mimeType)) {
    79                 Project project = FileOwnerQuery.getOwner(fo);
    80                 RemoteProject info = project.getLookup().lookup(RemoteProject.class);
    81                 if (info != null) {
    82                     ExecutionEnvironment dh = info.getDevelopmentHost();
    83                     if (dh != null) {
    84                         return dh;
    85                     }
    86                 }
    87             }
    88         }
    89         return null;
    90     }
    91 
    92     public static CompilerSet toolchain(Lookup.Provider project) {
    93         ToolchainProject toolchain = project.getLookup().lookup(ToolchainProject.class);
    94         if (toolchain != null) {
    95             return toolchain.getCompilerSet();
    96         }
    97         return null;
    98     }
    99 
   100     public static MakeConfigurationDescriptor getConfigurationDescriptor(CsmFile file, Lookup.Provider project) {
   101         if (file != null) {
   102             ConfigurationDescriptorProvider pdp = project.getLookup().lookup(ConfigurationDescriptorProvider.class);
   103             if (pdp != null) {
   104                 MakeConfigurationDescriptor makeConfigurationDescriptor = pdp.getConfigurationDescriptor();
   105                 if (makeConfigurationDescriptor != null) {
   106                     return makeConfigurationDescriptor;
   107                 }
   108             }
   109         }
   110 
   111         return null;
   112     }
   113 
   114     public static Item findItem(CsmFile file, Lookup.Provider project) {
   115         return getConfigurationDescriptor(file, project).findProjectItemByPath(file.getAbsolutePath().toString());
   116     }
   117 
   118     public static void fatalError(AnalyzerResponse.AnalyzerSeverity severity, String id, String message, CsmFile file, CsmErrorProvider.Response response) {
   119         CsmErrorInfo fatal = new ModernizeErrorProvider.FatalErrorInfo(id, message);
   120         if (response instanceof AnalyzerResponse) {
   121             AnalyzerResponse ar = (AnalyzerResponse) response;
   122             ar.addError(severity, message, file.getFileObject(), fatal); //NOI18N
   123         } else {
   124             response.addError(fatal); //NOI18N
   125         }
   126     }
   127 
   128     public static String useTool(Item item, Lookup.Provider project) {
   129         ToolchainProject toolchain = project.getLookup().lookup(ToolchainProject.class);
   130         if (toolchain != null) {
   131             CompilerSet set = toolchain.getCompilerSet();
   132             if (set != null) {
   133                 if (set.getCompilerFlavor().isSunStudioCompiler()) {
   134                     if (item.getLanguage() == NativeFileItem.Language.C) {
   135                         return set.findTool(PredefinedToolKind.CCompiler).getPath();
   136                     } else {
   137                         return set.findTool(PredefinedToolKind.CCCompiler).getPath();
   138                     }
   139                 }
   140             }
   141         }
   142         return null;
   143     }
   144 
   145     public static Tool compiler(Item item, Lookup.Provider project) {
   146         CompilerSet set = toolchain(project);
   147         if (set != null) {
   148             if (item.getLanguage() == NativeFileItem.Language.C) {
   149                 return set.findTool(PredefinedToolKind.CCompiler);
   150             } else {
   151                 return set.findTool(PredefinedToolKind.CCCompiler);
   152             }
   153         }
   154         return null;
   155     }
   156 
   157     public static List<String> scanCommandLine(String line) {
   158         List<String> res = new ArrayList<String>();
   159         int i = 0;
   160         StringBuilder current = new StringBuilder();
   161         boolean isSingleQuoteMode = false;
   162         boolean isDoubleQuoteMode = false;
   163         while (i < line.length()) {
   164             char c = line.charAt(i);
   165             i++;
   166             switch (c) {
   167                 case '\'': // NOI18N
   168                     if (isSingleQuoteMode) {
   169                         isSingleQuoteMode = false;
   170                     } else if (!isDoubleQuoteMode) {
   171                         isSingleQuoteMode = true;
   172                     }
   173                     current.append(c);
   174                     break;
   175                 case '\"': // NOI18N
   176                     if (isDoubleQuoteMode) {
   177                         isDoubleQuoteMode = false;
   178                     } else if (!isSingleQuoteMode) {
   179                         isDoubleQuoteMode = true;
   180                     }
   181                     current.append(c);
   182                     break;
   183                 case ' ': // NOI18N
   184                 case '\t': // NOI18N
   185                 case '\n': // NOI18N
   186                 case '\r': // NOI18N
   187                     if (isSingleQuoteMode || isDoubleQuoteMode) {
   188                         current.append(c);
   189                         break;
   190                     } else {
   191                         if (current.length() > 0) {
   192                             res.add(current.toString());
   193                             current.setLength(0);
   194                         }
   195                     }
   196                     break;
   197                 default:
   198                     current.append(c);
   199                     break;
   200             }
   201         }
   202         if (current.length() > 0) {
   203             res.add(current.toString());
   204         }
   205         return res;
   206     }
   207 
   208 }