⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 removeunused.py

📁 finite element library for mathematic majored research
💻 PY
字号:
"Utility function for removing unused variables from a C++ code"__author__ = "Anders Logg (logg@simula.no)"__date__ = "2007-03-07 -- 2007-05-17"__copyright__ = "Copyright (C) 2007 Anders Logg"__license__  = "GNU GPL version 3 or any later version"# Python modulesimport re# FFC common modulesfrom ffc.common.debug import *# Declarations to examinetypes = [["double"], ["const", "double"], ["const", "double", "*", "const", "*"], ["int"], ["const", "int"]]# Special characters and delimitersspecial_characters = ["+", "-", "*", "/", "=", ".", " ", ";", "(", ")", "\\", "{", "}", "[","]"]def remove_unused(code):    """Remove unused variables from a given C++ code. This is useful    when generating code that will be compiled with gcc and options    -Wall -Werror, in which case gcc returns an error when seeing a    variable declaration for a variable that is never used."""    # Dictionary of (declaration_line, used_lines) for variables    variables = {}    # List of variable names (so we can search them in order)    variable_names = []    # Examine code line by line    lines = code.split("\n")    for line_number in range(len(lines)):        # Split words        line = lines[line_number]        words = [word for word in line.split(" ") if not word == ""]        # Remember line where variable is declared        for type in [type for type in types if len(words) > len(type)]:            variable_type = words[0:len(type)]            variable_name = words[len(type)]            if variable_name in special_characters:                continue            if variable_type == type:                # Test if any of the special characters are present in the variable name                # If this is the case, then remove these by assuming that the 'real' name                # is the first entry in the return list. This is implemented to prevent                # removal of e.g. 'double array[6]' if it is later used in a loop as 'array[i]'                var = [variable_name.split(sep)[0] for sep in special_characters\                       if str(variable_name) != variable_name.split(sep)[0]]                if (var):                    variable_name = var[0]                variables[variable_name] = (line_number, [])                if not variable_name in variable_names:                    variable_names += [variable_name]        # Mark line for used variables        for variable_name in variables:            (declaration_line, used_lines) = variables[variable_name]            if __variable_in_line(variable_name, line) and line_number > declaration_line:                variables[variable_name] = (declaration_line, used_lines + [line_number])    # Reverse the order of the variable names (to catch variables used    # only by variables that are removed)    variable_names.reverse()        # Remove declarations that are not used (need to search backwards)    removed_lines = []    for variable_name in variable_names:        (declaration_line, used_lines) = variables[variable_name]        for line in removed_lines:            if line in used_lines:                used_lines.remove(line)        if used_lines == []:            debug("Removing unused variable: %s" % variable_name, 1)            #lines[declaration_line] = "// " + lines[declaration_line]            lines[declaration_line] = None            removed_lines += [declaration_line]            return "\n".join([line for line in lines if not line == None])def __variable_in_line(variable_name, line):    "Check if variable name is used in line"    if not variable_name in line:        return False    for character in special_characters:        line = line.replace(character, "\\" + character)    delimiter = "[" + ",".join("\\" + c for c in special_characters) + "]"    return not re.search(delimiter + variable_name + delimiter, line) == None

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -