/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.js.translate.operation;
import com.google.common.collect.
ImmutableBiMap;
import org.jetbrains.kotlin.js.backend.ast.
JsBinaryOperator;
import org.jetbrains.kotlin.js.backend.ast.
JsUnaryOperator;
import org.jetbrains.annotations.
NotNull;
import org.jetbrains.kotlin.lexer.
KtToken;
import org.jetbrains.kotlin.lexer.
KtTokens;
import java.util.
Map;
public final class
OperatorTable {
//TODO : not all operators , add and test bit operators
private static final
Map<
KtToken,
JsBinaryOperator>
binaryOperatorsMap =
ImmutableBiMap.<
KtToken,
JsBinaryOperator>
builder()
.
put(
KtTokens.
PLUS,
JsBinaryOperator.
ADD)
.
put(
KtTokens.
MINUS,
JsBinaryOperator.
SUB)
.
put(
KtTokens.
MUL,
JsBinaryOperator.
MUL)
.
put(
KtTokens.
DIV,
JsBinaryOperator.
DIV)
.
put(
KtTokens.
EQ,
JsBinaryOperator.
ASG)
.
put(
KtTokens.
GT,
JsBinaryOperator.
GT)
.
put(
KtTokens.
GTEQ,
JsBinaryOperator.
GTE)
.
put(
KtTokens.
LT,
JsBinaryOperator.
LT)
.
put(
KtTokens.
LTEQ,
JsBinaryOperator.
LTE)
.
put(
KtTokens.
ANDAND,
JsBinaryOperator.
AND)
.
put(
KtTokens.
OROR,
JsBinaryOperator.
OR)
.
put(
KtTokens.
PERC,
JsBinaryOperator.
MOD)
.
put(
KtTokens.
PLUSEQ,
JsBinaryOperator.
ASG_ADD)
.
put(
KtTokens.
MINUSEQ,
JsBinaryOperator.
ASG_SUB)
.
put(
KtTokens.
DIVEQ,
JsBinaryOperator.
ASG_DIV)
.
put(
KtTokens.
MULTEQ,
JsBinaryOperator.
ASG_MUL)
.
put(
KtTokens.
PERCEQ,
JsBinaryOperator.
ASG_MOD)
.
put(
KtTokens.
IN_KEYWORD,
JsBinaryOperator.
INOP)
.
put(
KtTokens.
EQEQEQ,
JsBinaryOperator.
REF_EQ)
.
put(
KtTokens.
EXCLEQEQEQ,
JsBinaryOperator.
REF_NEQ)
.
build();
private static final
ImmutableBiMap<
KtToken,
JsUnaryOperator>
unaryOperatorsMap =
ImmutableBiMap.<
KtToken,
JsUnaryOperator>
builder()
.
put(
KtTokens.
PLUSPLUS,
JsUnaryOperator.
INC)
.
put(
KtTokens.
MINUSMINUS,
JsUnaryOperator.
DEC)
.
put(
KtTokens.
EXCL,
JsUnaryOperator.
NOT)
.
put(
KtTokens.
MINUS,
JsUnaryOperator.
NEG)
.
put(
KtTokens.
PLUS,
JsUnaryOperator.
POS)
.
build();
private
OperatorTable() {
}
public static boolean
hasCorrespondingOperator(@
NotNull KtToken token) {
return
binaryOperatorsMap.
containsKey(
token) ||
unaryOperatorsMap.
containsKey(
token);
}
public static boolean
hasCorrespondingBinaryOperator(@
NotNull KtToken token) {
return
binaryOperatorsMap.
containsKey(
token);
}
@
NotNull
static public
JsBinaryOperator getBinaryOperator(@
NotNull KtToken token) {
assert
KtTokens.
OPERATIONS.
contains(
token) : "Token should represent an operation!";
return
binaryOperatorsMap.
get(
token);
}
@
NotNull
static public
JsUnaryOperator getUnaryOperator(@
NotNull KtToken token) {
assert
KtTokens.
OPERATIONS.
contains(
token) : "Token should represent an operation!";
return
unaryOperatorsMap.
get(
token);
}
}