blob: e73b9d3486458ceba6124778e5a853ade00d91ce [file] [log] [blame]
package compile
import (
"v.io/x/ref/lib/vdl/vdlutil"
)
// ReservedMode indicates which mode to perform reserved-word checking:
// ReservedNormal - Check the given identifier.
// ReservedCamelCase - Check the given identifier in lower-camel-case.
type ReservedMode int
const (
ReservedNormal ReservedMode = iota
ReservedCamelCase
)
// reservedWord checks if identifiers are reserved after they are converted to the native form for the language.
func reservedWord(ident string, mode ReservedMode) bool {
return reservedWordJava(ident, mode) ||
reservedWordJavascript(ident, mode) ||
reservedWordGo(ident)
// TODO(bprosnitz) Other identifiers? (set, assert, raise, with, etc)
}
func reservedWordJava(ident string, mode ReservedMode) bool {
if mode == ReservedCamelCase {
ident = vdlutil.ToCamelCase(ident)
}
_, isReserved := javaReservedWords[ident]
return isReserved
}
var javaReservedWords = map[string]bool{
"abstract": true,
"assert": true,
"boolean": true,
"break": true,
"byte": true,
"case": true,
"catch": true,
"char": true,
"class": true,
"const": true,
"continue": true,
"default": true,
"do": true,
"double": true,
"else": true,
"enum": true,
"extends": true,
"final": true,
"finally": true,
"float": true,
"for": true,
"goto": true,
"if": true,
"implements": true,
"import": true,
"instanceof": true,
"int": true,
"interface": true,
"long": true,
"native": true,
"new": true,
"package": true,
"private": true,
"protected": true,
"public": true,
"return": true,
"short": true,
"static": true,
"strictfp": true,
"super": true,
"switch": true,
"synchronized": true,
"this": true,
"throw": true,
"throws": true,
"transient": true,
"try": true,
"void": true,
"volatile": true,
"while": true,
}
func reservedWordGo(ident string) bool {
_, isReserved := goReservedWords[ident]
return isReserved
}
var goReservedWords = map[string]bool{
"break": true,
"case": true,
"chan": true,
"const": true,
"continue": true,
"default": true,
"defer": true,
"else": true,
"fallthrough": true,
"for": true,
"func": true,
"go": true,
"goto": true,
"if": true,
"import": true,
"interface": true,
"map": true,
"package": true,
"range": true,
"return": true,
"select": true,
"struct": true,
"switch": true,
"type": true,
"var": true,
}
func reservedWordJavascript(ident string, mode ReservedMode) bool {
if mode == ReservedCamelCase {
ident = vdlutil.ToCamelCase(ident)
}
_, isReserved := javascriptReservedWords[ident]
return isReserved
}
var javascriptReservedWords = map[string]bool{
"break": true,
"case": true,
"catch": true,
"continue": true,
"debugger": true,
"default": true,
//"delete": true, // TODO(bprosnitz) Look into adding this back. This conflicts with Delete() on Content in repository.vdlutil.
"do": true,
"else": true,
"finally": true,
"for": true,
"function": true,
"if": true,
//"in": true, // TODO(bprosnitz) Look into addint this back. It conflicts with In in access/service.vdlutil.
"instanceof": true,
"new": true,
"return": true,
"switch": true,
"this": true,
"throw": true,
"try": true,
"typeof": true,
"var": true,
"void": true,
"while": true,
"with": true,
}