Jiri Simsa | d7616c9 | 2015-03-24 23:44:30 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Vanadium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 5 | package compile |
| 6 | |
| 7 | import ( |
Jiri Simsa | ffceefa | 2015-02-28 11:03:34 -0800 | [diff] [blame] | 8 | "v.io/x/ref/lib/vdl/vdlutil" |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 9 | ) |
| 10 | |
Todd Wang | 53a4e2e | 2015-03-18 10:54:54 -0700 | [diff] [blame] | 11 | // reservedMode indicates which mode to perform reserved-word checking: |
| 12 | // reservedNormal - Check identifier as-is. |
| 13 | // reservedFirstRuneLower - Check identifier with the first rune lowercased. |
| 14 | type reservedMode int |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 15 | |
| 16 | const ( |
Todd Wang | 53a4e2e | 2015-03-18 10:54:54 -0700 | [diff] [blame] | 17 | reservedNormal reservedMode = iota |
| 18 | reservedFirstRuneLower |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 19 | ) |
| 20 | |
| 21 | // reservedWord checks if identifiers are reserved after they are converted to the native form for the language. |
Todd Wang | 53a4e2e | 2015-03-18 10:54:54 -0700 | [diff] [blame] | 22 | func reservedWord(ident string, mode reservedMode) bool { |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 23 | return reservedWordJava(ident, mode) || |
| 24 | reservedWordJavascript(ident, mode) || |
| 25 | reservedWordGo(ident) |
| 26 | // TODO(bprosnitz) Other identifiers? (set, assert, raise, with, etc) |
| 27 | } |
| 28 | |
Todd Wang | 53a4e2e | 2015-03-18 10:54:54 -0700 | [diff] [blame] | 29 | func reservedWordJava(ident string, mode reservedMode) bool { |
| 30 | if mode == reservedFirstRuneLower { |
| 31 | ident = vdlutil.FirstRuneToLower(ident) |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 32 | } |
Jiri Simsa | 87d884d | 2015-06-18 10:25:54 -0700 | [diff] [blame] | 33 | return javaReservedWords[ident] |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | var javaReservedWords = map[string]bool{ |
| 37 | "abstract": true, |
| 38 | "assert": true, |
| 39 | "boolean": true, |
| 40 | "break": true, |
| 41 | "byte": true, |
| 42 | "case": true, |
| 43 | "catch": true, |
| 44 | "char": true, |
| 45 | "class": true, |
| 46 | "const": true, |
| 47 | "continue": true, |
| 48 | "default": true, |
| 49 | "do": true, |
| 50 | "double": true, |
| 51 | "else": true, |
| 52 | "enum": true, |
| 53 | "extends": true, |
| 54 | "final": true, |
| 55 | "finally": true, |
| 56 | "float": true, |
| 57 | "for": true, |
| 58 | "goto": true, |
| 59 | "if": true, |
| 60 | "implements": true, |
| 61 | "import": true, |
| 62 | "instanceof": true, |
| 63 | "int": true, |
| 64 | "interface": true, |
| 65 | "long": true, |
| 66 | "native": true, |
| 67 | "new": true, |
| 68 | "package": true, |
| 69 | "private": true, |
| 70 | "protected": true, |
| 71 | "public": true, |
| 72 | "return": true, |
| 73 | "short": true, |
| 74 | "static": true, |
| 75 | "strictfp": true, |
| 76 | "super": true, |
| 77 | "switch": true, |
| 78 | "synchronized": true, |
| 79 | "this": true, |
| 80 | "throw": true, |
| 81 | "throws": true, |
| 82 | "transient": true, |
| 83 | "try": true, |
| 84 | "void": true, |
| 85 | "volatile": true, |
| 86 | "while": true, |
| 87 | } |
| 88 | |
| 89 | func reservedWordGo(ident string) bool { |
Jiri Simsa | 87d884d | 2015-06-18 10:25:54 -0700 | [diff] [blame] | 90 | return goReservedWords[ident] |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 91 | } |
| 92 | |
| 93 | var goReservedWords = map[string]bool{ |
| 94 | "break": true, |
| 95 | "case": true, |
| 96 | "chan": true, |
| 97 | "const": true, |
| 98 | "continue": true, |
| 99 | "default": true, |
| 100 | "defer": true, |
| 101 | "else": true, |
| 102 | "fallthrough": true, |
| 103 | "for": true, |
| 104 | "func": true, |
| 105 | "go": true, |
| 106 | "goto": true, |
| 107 | "if": true, |
| 108 | "import": true, |
| 109 | "interface": true, |
| 110 | "map": true, |
| 111 | "package": true, |
| 112 | "range": true, |
| 113 | "return": true, |
| 114 | "select": true, |
| 115 | "struct": true, |
| 116 | "switch": true, |
| 117 | "type": true, |
| 118 | "var": true, |
| 119 | } |
| 120 | |
Todd Wang | 53a4e2e | 2015-03-18 10:54:54 -0700 | [diff] [blame] | 121 | func reservedWordJavascript(ident string, mode reservedMode) bool { |
| 122 | if mode == reservedFirstRuneLower { |
| 123 | ident = vdlutil.FirstRuneToLower(ident) |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 124 | } |
Jiri Simsa | 87d884d | 2015-06-18 10:25:54 -0700 | [diff] [blame] | 125 | return javascriptReservedWords[ident] |
Todd Wang | 232d649 | 2015-02-25 18:04:54 -0800 | [diff] [blame] | 126 | } |
| 127 | |
| 128 | var javascriptReservedWords = map[string]bool{ |
| 129 | "break": true, |
| 130 | "case": true, |
| 131 | "catch": true, |
| 132 | "continue": true, |
| 133 | "debugger": true, |
| 134 | "default": true, |
| 135 | //"delete": true, // TODO(bprosnitz) Look into adding this back. This conflicts with Delete() on Content in repository.vdlutil. |
| 136 | "do": true, |
| 137 | "else": true, |
| 138 | "finally": true, |
| 139 | "for": true, |
| 140 | "function": true, |
| 141 | "if": true, |
| 142 | //"in": true, // TODO(bprosnitz) Look into addint this back. It conflicts with In in access/service.vdlutil. |
| 143 | "instanceof": true, |
| 144 | "new": true, |
| 145 | "return": true, |
| 146 | "switch": true, |
| 147 | "this": true, |
| 148 | "throw": true, |
| 149 | "try": true, |
| 150 | "typeof": true, |
| 151 | "var": true, |
| 152 | "void": true, |
| 153 | "while": true, |
| 154 | "with": true, |
| 155 | } |