/ company-solidity.el
company-solidity.el
1 ;;; company-solidity.el --- Company-mode back-end for solidity-mode 2 3 ;; Copyright (C) 2018 Samuel Smolkin 4 5 ;; Author: Samuel Smolkin <sam@future-precedent.org> 6 ;; URL: https://github.com/ethereum/emacs-solidity 7 ;; Keywords: solidity, completion, company 8 ;; Version: 2.0.0 9 ;; Package-Requires: ((company "0.9.0") (cl-lib "0.5.0") (solidity-mode "0.1.9")) 10 11 ;; This program is free software; you can redistribute it and/or modify 12 ;; it under the terms of the GNU General Public License as published by 13 ;; the Free Software Foundation, either version 3 of the License, or 14 ;; (at your option) any later version. 15 16 ;; This program is distributed in the hope that it will be useful, 17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 ;; GNU General Public License for more details. 20 21 ;; You should have received a copy of the GNU General Public License 22 ;; along with this program. If not, see <http://www.gnu.org/licenses/>. 23 24 ;;; Commentary: 25 26 ;; This package provides a simple company-mode back-end for auto-completing Solidity keywords when working in solidity-mode. 27 28 ;;; Code: 29 30 (require 'cl-lib) 31 (require 'company) 32 33 ;; Additional completion targets whcih are nore part of solidty-mode syntax-highlighting keywords lists: 34 35 (defconst company-solidity-additional-math 36 '("addmod" 37 "mulmod")) 38 39 (defconst company-solidity-additional-hashing 40 '("keccak256" 41 "sha256" 42 "sha3" 43 "ripemd160" 44 "ecrecover")) 45 46 (defconst company-solidity-additional-block-methods 47 '("block.blockhash" 48 "block.coinbase" 49 "block.difficulty" 50 "block.gaslimit" 51 "block.number" 52 "block.timestamp" 53 "now")) 54 55 (defconst company-solidity-additional-msg-methods 56 '("msg.data" 57 "msg.gas" 58 "msg.sender" 59 "msg.sig" 60 "msg.value" 61 "gasleft")) 62 63 (defconst company-solidity-additional-tx-methods 64 '("tx.gasprice" 65 "tx.origin")) 66 67 (defconst company-solidity-additional-address-methods 68 '("balance" 69 "transfer" 70 "send" 71 "call" 72 "callcode" 73 "delegatecall")) 74 75 (defconst company-solidity-additional-contracts 76 '("super" 77 "selfdestruct" 78 "suicide")) 79 80 (defconst company-solidity-additional-modifiers 81 '("payable")) 82 83 (defconst company-solidity-additional-pragma 84 '("solidity")) 85 86 (defconst company-solidity-additional-types 87 '("fixed" 88 "ufixed" 89 "hex")) 90 91 (defconst company-solidity-additional-function-methods 92 '("selector")) 93 94 ;; defvar symbols taken from solidity-mode.el to avoid reference warnings 95 (defvar solidity-keywords) 96 (defvar solidity-constants) 97 (defvar solidity-variable-modifier) 98 (defvar solidity-builtin-types) 99 (defvar solidity-builtin-constructs) 100 101 ;; Completion targets taken from solidity-mode syntax-highlighting keywords lists, plus additional targets above. 102 (defconst company-solidity-keywords 103 (append 104 solidity-keywords 105 solidity-constants 106 solidity-variable-modifier 107 solidity-builtin-types 108 solidity-builtin-constructs 109 company-solidity-additional-math 110 company-solidity-additional-hashing 111 company-solidity-additional-block-methods 112 company-solidity-additional-msg-methods 113 company-solidity-additional-tx-methods 114 company-solidity-additional-address-methods 115 company-solidity-additional-contracts 116 company-solidity-additional-modifiers 117 company-solidity-additional-pragma 118 company-solidity-additional-types 119 company-solidity-additional-function-methods)) 120 121 ;;;###autoload 122 (defun company-solidity (command &optional arg &rest ignored) 123 "Autocompletion for solidity with company mode. 124 125 Argument COMMAND `company-backend` functions. 126 Optional argument ARG the completion target prefix. 127 Optional argument IGNORED Additional arguments are ingnored." 128 (interactive (list 'interactive)) 129 (set (make-local-variable 'company-minimum-prefix-length) 2) 130 (cl-case command 131 (interactive (company-begin-backend 'company-solidity)) 132 (prefix (and (eq major-mode 'solidity-mode) 133 (company-grab-symbol))) 134 (candidates 135 (cl-remove-if-not 136 (lambda (c) (string-prefix-p arg c)) 137 company-solidity-keywords)))) 138 139 (add-to-list 'company-backends 'company-solidity) 140 141 (provide 'company-solidity) 142 143 ;;; company-solidity.el ends here