forked from qt-creator/qt-creator
		
	
		
			
	
	
		
			151 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			151 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/sh
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################################################################################
							 | 
						||
| 
								 | 
							
								# Copyright (C) 2015 The Qt Company Ltd.
							 | 
						||
| 
								 | 
							
								# All rights reserved.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								# modification, are permitted provided that the following conditions are met:
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#   * Redistributions of source code must retain the above copyright notice,
							 | 
						||
| 
								 | 
							
								#     this list of conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								#   * Redistributions in binary form must reproduce the above copyright notice,
							 | 
						||
| 
								 | 
							
								#     this list of conditions and the following disclaimer in the documentation
							 | 
						||
| 
								 | 
							
								#     and/or other materials provided with the distribution.
							 | 
						||
| 
								 | 
							
								#   * Neither the name of The Qt Company Ltd, nor the names of its contributors
							 | 
						||
| 
								 | 
							
								#     may be used to endorse or promote products derived from this software
							 | 
						||
| 
								 | 
							
								#     without specific prior written permission.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
							 | 
						||
| 
								 | 
							
								# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						||
| 
								 | 
							
								# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
							 | 
						||
| 
								 | 
							
								# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
							 | 
						||
| 
								 | 
							
								# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
							 | 
						||
| 
								 | 
							
								# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
							 | 
						||
| 
								 | 
							
								# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
							 | 
						||
| 
								 | 
							
								# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
							 | 
						||
| 
								 | 
							
								# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
							 | 
						||
| 
								 | 
							
								# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								################################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --- helpers -----------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								printUsage()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    echo "Usage: $0 [-v] [-c clang-executable] file line column"
							 | 
						||
| 
								 | 
							
								    echo
							 | 
						||
| 
								 | 
							
								    echo "Options:"
							 | 
						||
| 
								 | 
							
								    echo "  -v                   Run c-index-test instead of clang to get more details."
							 | 
						||
| 
								 | 
							
								    echo "  -c clang-executable  Use the provided clang-executable."
							 | 
						||
| 
								 | 
							
								    echo
							 | 
						||
| 
								 | 
							
								    echo "The clang executable is determined by this order:"
							 | 
						||
| 
								 | 
							
								    echo "  1. Use clang from the -c option."
							 | 
						||
| 
								 | 
							
								    echo "  2. Use clang from environment variable CLANG_FOR_COMPLETION."
							 | 
						||
| 
								 | 
							
								    echo "  3. Use clang from \$PATH."
							 | 
						||
| 
								 | 
							
								    echo
							 | 
						||
| 
								 | 
							
								    echo "Path to c-index-test will be determined with the help of the clang executable."
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# There is no readlink on cygwin.
							 | 
						||
| 
								 | 
							
								hasReadLink()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return $(command -v readlink >/dev/null 2>&1)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								checkIfFileExistsOrDie()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [ ! -f "$1" ] && echo "'$1' is not a file or does not exist." && exit 1
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								checkIfFileExistsAndIsExecutableOrDie()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    checkIfFileExistsOrDie "$1"
							 | 
						||
| 
								 | 
							
								    [ ! -x "$1" ] && echo "'$1' is not executable." && exit 2
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								findClangOrDie()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if [ -z "$CLANG_EXEC" ]; then
							 | 
						||
| 
								 | 
							
								        if [ -n "${CLANG_FOR_COMPLETION}" ]; then
							 | 
						||
| 
								 | 
							
								            CLANG_EXEC=${CLANG_FOR_COMPLETION}
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								            CLANG_EXEC=$(which clang)
							 | 
						||
| 
								 | 
							
								        fi
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    hasReadLink && CLANG_EXEC=$(readlink -e "$CLANG_EXEC")
							 | 
						||
| 
								 | 
							
								    checkIfFileExistsAndIsExecutableOrDie "$CLANG_EXEC"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								findCIndexTestOrDie()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if [ -n "$RUN_WITH_CINDEXTEST" ]; then
							 | 
						||
| 
								 | 
							
								        CINDEXTEST_EXEC=$(echo $CLANG_EXEC | sed -e 's/clang/c-index-test/g')
							 | 
						||
| 
								 | 
							
								        hasReadLink && CINDEXTEST_EXEC=$(readlink -e "$CINDEXTEST_EXEC")
							 | 
						||
| 
								 | 
							
								        checkIfFileExistsAndIsExecutableOrDie "$CINDEXTEST_EXEC"
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								printClangVersion()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    command="${CLANG_EXEC} --version"
							 | 
						||
| 
								 | 
							
								    echo "Command: $command"
							 | 
						||
| 
								 | 
							
								    eval $command
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								runCodeCompletion()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if [ -n "${CINDEXTEST_EXEC}" ]; then
							 | 
						||
| 
								 | 
							
								        command="${CINDEXTEST_EXEC} -code-completion-at=${FILE}:${LINE}:${COLUMN} ${FILE}"
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        command="${CLANG_EXEC} -cc1 -code-completion-at ${FILE}:${LINE}:${COLUMN} ${FILE}"
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    echo "Command: $command"
							 | 
						||
| 
								 | 
							
								    eval $command
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --- Process arguments -------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CLANG_EXEC=
							 | 
						||
| 
								 | 
							
								RUN_WITH_CINDEXTEST=
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FILE=
							 | 
						||
| 
								 | 
							
								LINE=
							 | 
						||
| 
								 | 
							
								COLUMN=
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								while [ -n "$1" ]; do
							 | 
						||
| 
								 | 
							
								    param=$1
							 | 
						||
| 
								 | 
							
								    shift
							 | 
						||
| 
								 | 
							
								    case $param in
							 | 
						||
| 
								 | 
							
								        -h | -help | --help)
							 | 
						||
| 
								 | 
							
								            printUsage
							 | 
						||
| 
								 | 
							
								            exit 0
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        -v | -verbose | --verbose)
							 | 
						||
| 
								 | 
							
								            RUN_WITH_CINDEXTEST=1
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        -c | -clang | --clang)
							 | 
						||
| 
								 | 
							
								            CLANG_EXEC=$1
							 | 
						||
| 
								 | 
							
								            shift
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        *)
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								    esac
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[ "$#" -ne 2 ] && printUsage && exit 1
							 | 
						||
| 
								 | 
							
								checkIfFileExistsOrDie "$param"
							 | 
						||
| 
								 | 
							
								FILE=$param
							 | 
						||
| 
								 | 
							
								LINE=$1
							 | 
						||
| 
								 | 
							
								COLUMN=$2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --- main --------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								findClangOrDie
							 | 
						||
| 
								 | 
							
								findCIndexTestOrDie
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								printClangVersion
							 | 
						||
| 
								 | 
							
								echo
							 | 
						||
| 
								 | 
							
								runCodeCompletion
							 | 
						||
| 
								 | 
							
								
							 |