// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package compile

import (
	"v.io/x/ref/lib/vdl/vdlutil"
)

// reservedMode indicates which mode to perform reserved-word checking:
//   reservedNormal         - Check identifier as-is.
//   reservedFirstRuneLower - Check identifier with the first rune lowercased.
type reservedMode int

const (
	reservedNormal reservedMode = iota
	reservedFirstRuneLower
)

// 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 == reservedFirstRuneLower {
		ident = vdlutil.FirstRuneToLower(ident)
	}
	return javaReservedWords[ident]
}

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 {
	return goReservedWords[ident]
}

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 == reservedFirstRuneLower {
		ident = vdlutil.FirstRuneToLower(ident)
	}
	return javascriptReservedWords[ident]
}

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,
}
