001/*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.jetbrains.jet.lang.types.expressions;
018
019import com.google.common.collect.ImmutableBiMap;
020import com.google.common.collect.ImmutableMap;
021import com.google.common.collect.ImmutableSet;
022import org.jetbrains.annotations.NotNull;
023import org.jetbrains.annotations.Nullable;
024import org.jetbrains.jet.lang.resolve.name.Name;
025import org.jetbrains.jet.lexer.JetToken;
026import org.jetbrains.jet.lexer.JetTokens;
027
028public class OperatorConventions {
029
030    public static final Name EQUALS = Name.identifier("equals");
031    public static final Name COMPARE_TO = Name.identifier("compareTo");
032    public static final Name CONTAINS = Name.identifier("contains");
033
034    private OperatorConventions() {}
035
036    // Names for primitive type conversion properties
037    public static final Name DOUBLE = Name.identifier("toDouble");
038    public static final Name FLOAT = Name.identifier("toFloat");
039    public static final Name LONG = Name.identifier("toLong");
040    public static final Name INT = Name.identifier("toInt");
041    public static final Name CHAR = Name.identifier("toChar");
042    public static final Name SHORT = Name.identifier("toShort");
043    public static final Name BYTE = Name.identifier("toByte");
044
045
046    public static final ImmutableSet<Name> NUMBER_CONVERSIONS = ImmutableSet.of(
047            DOUBLE, FLOAT, LONG, INT, SHORT, BYTE, CHAR
048    );
049
050    public static final ImmutableBiMap<JetToken, Name> UNARY_OPERATION_NAMES = ImmutableBiMap.<JetToken, Name>builder()
051            .put(JetTokens.PLUSPLUS, Name.identifier("inc"))
052            .put(JetTokens.MINUSMINUS, Name.identifier("dec"))
053            .put(JetTokens.PLUS, Name.identifier("plus"))
054            .put(JetTokens.MINUS, Name.identifier("minus"))
055            .put(JetTokens.EXCL, Name.identifier("not"))
056            .build();
057
058    public static final ImmutableBiMap<JetToken, Name> BINARY_OPERATION_NAMES = ImmutableBiMap.<JetToken, Name>builder()
059            .put(JetTokens.MUL, Name.identifier("times"))
060            .put(JetTokens.PLUS, Name.identifier("plus"))
061            .put(JetTokens.MINUS, Name.identifier("minus"))
062            .put(JetTokens.DIV, Name.identifier("div"))
063            .put(JetTokens.PERC, Name.identifier("mod"))
064            .put(JetTokens.ARROW, Name.identifier("arrow"))
065            .put(JetTokens.RANGE, Name.identifier("rangeTo"))
066            .build();
067
068    public static final ImmutableSet<JetToken> NOT_OVERLOADABLE = 
069            ImmutableSet.<JetToken>of(JetTokens.ANDAND, JetTokens.OROR, JetTokens.ELVIS);
070    
071    public static final ImmutableSet<JetToken> INCREMENT_OPERATIONS =
072            ImmutableSet.<JetToken>of(JetTokens.PLUSPLUS, JetTokens.MINUSMINUS);
073
074    public static final ImmutableSet<JetToken> COMPARISON_OPERATIONS =
075            ImmutableSet.<JetToken>of(JetTokens.LT, JetTokens.GT, JetTokens.LTEQ, JetTokens.GTEQ);
076
077    public static final ImmutableSet<JetToken> EQUALS_OPERATIONS =
078            ImmutableSet.<JetToken>of(JetTokens.EQEQ, JetTokens.EXCLEQ);
079
080    public static final ImmutableSet<JetToken> IN_OPERATIONS =
081            ImmutableSet.<JetToken>of(JetTokens.IN_KEYWORD, JetTokens.NOT_IN);
082
083    public static final ImmutableBiMap<JetToken, Name> ASSIGNMENT_OPERATIONS = ImmutableBiMap.<JetToken, Name>builder()
084            .put(JetTokens.MULTEQ, Name.identifier("timesAssign"))
085            .put(JetTokens.DIVEQ, Name.identifier("divAssign"))
086            .put(JetTokens.PERCEQ, Name.identifier("modAssign"))
087            .put(JetTokens.PLUSEQ, Name.identifier("plusAssign"))
088            .put(JetTokens.MINUSEQ, Name.identifier("minusAssign"))
089            .build();
090
091    public static final ImmutableMap<JetToken, JetToken> ASSIGNMENT_OPERATION_COUNTERPARTS = ImmutableMap.<JetToken, JetToken>builder()
092            .put(JetTokens.MULTEQ, JetTokens.MUL)
093            .put(JetTokens.DIVEQ, JetTokens.DIV)
094            .put(JetTokens.PERCEQ, JetTokens.PERC)
095            .put(JetTokens.PLUSEQ, JetTokens.PLUS)
096            .put(JetTokens.MINUSEQ, JetTokens.MINUS)
097            .build();
098
099    public static final ImmutableBiMap<JetToken, Name> BOOLEAN_OPERATIONS = ImmutableBiMap.<JetToken, Name>builder()
100             .put(JetTokens.ANDAND, Name.identifier("and"))
101             .put(JetTokens.OROR, Name.identifier("or"))
102             .build();
103    
104    @Nullable
105    public static Name getNameForOperationSymbol(@NotNull JetToken token) {
106        Name name = UNARY_OPERATION_NAMES.get(token);
107        if (name != null) return name;
108        name = BINARY_OPERATION_NAMES.get(token);
109        if (name != null) return name;
110        name = ASSIGNMENT_OPERATIONS.get(token);
111        if (name != null) return name;
112        if (COMPARISON_OPERATIONS.contains(token)) return COMPARE_TO;
113        if (EQUALS_OPERATIONS.contains(token)) return EQUALS;
114        if (IN_OPERATIONS.contains(token)) return CONTAINS;
115        return null;
116    }
117}