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.k2js.translate.utils;
018
019import com.intellij.psi.PsiElement;
020import com.intellij.psi.tree.IElementType;
021import org.jetbrains.annotations.NotNull;
022import org.jetbrains.annotations.Nullable;
023import org.jetbrains.jet.lang.psi.*;
024import org.jetbrains.jet.lexer.JetToken;
025import org.jetbrains.jet.lexer.JetTokens;
026
027import java.util.Collections;
028import java.util.List;
029
030public final class PsiUtils {
031
032    private PsiUtils() {
033    }
034
035    @Nullable
036    public static JetSimpleNameExpression getSelectorAsSimpleName(@NotNull JetQualifiedExpression expression) {
037        JetExpression selectorExpression = getSelector(expression);
038        if (!(selectorExpression instanceof JetSimpleNameExpression)) {
039            return null;
040        }
041        return (JetSimpleNameExpression) selectorExpression;
042    }
043
044    @NotNull
045    public static JetExpression getSelector(@NotNull JetQualifiedExpression expression) {
046        JetExpression selectorExpression = expression.getSelectorExpression();
047        assert selectorExpression != null : "Selector should not be null.";
048        return selectorExpression;
049    }
050
051    @NotNull
052    public static JetSimpleNameExpression getNotNullSimpleNameSelector(@NotNull JetQualifiedExpression expression) {
053        JetSimpleNameExpression selectorAsSimpleName = getSelectorAsSimpleName(expression);
054        assert selectorAsSimpleName != null;
055        return selectorAsSimpleName;
056    }
057
058    @NotNull
059    public static JetToken getOperationToken(@NotNull JetOperationExpression expression) {
060        JetSimpleNameExpression operationExpression = expression.getOperationReference();
061        IElementType elementType = operationExpression.getReferencedNameElementType();
062        assert elementType instanceof JetToken : "Unary expression should have operation token of type JetToken";
063        return (JetToken) elementType;
064    }
065
066    @NotNull
067    public static JetExpression getBaseExpression(@NotNull JetUnaryExpression expression) {
068        JetExpression baseExpression = expression.getBaseExpression();
069        assert baseExpression != null;
070        return baseExpression;
071    }
072
073    public static boolean isPrefix(@NotNull JetUnaryExpression expression) {
074        return (expression instanceof JetPrefixExpression);
075    }
076
077    public static boolean isAssignment(JetToken token) {
078        return (token == JetTokens.EQ);
079    }
080
081    public static boolean isInOrNotInOperation(@NotNull JetBinaryExpression binaryExpression) {
082        return isInOperation(binaryExpression) || isNotInOperation(binaryExpression);
083    }
084
085    public static boolean isNotInOperation(@NotNull JetBinaryExpression binaryExpression) {
086        return (binaryExpression.getOperationToken() == JetTokens.NOT_IN);
087    }
088
089    public static boolean isNegatedOperation(@NotNull JetBinaryExpression binaryExpression) {
090        return (binaryExpression.getOperationToken() == JetTokens.EXCLEQ) || isNotInOperation(binaryExpression);
091    }
092
093    private static boolean isInOperation(@NotNull JetBinaryExpression binaryExpression) {
094        return (binaryExpression.getOperationToken() == JetTokens.IN_KEYWORD);
095    }
096
097    @NotNull
098    public static JetExpression getCallee(@NotNull JetCallExpression expression) {
099        JetExpression calleeExpression = expression.getCalleeExpression();
100        assert calleeExpression != null;
101        return calleeExpression;
102    }
103
104    @NotNull
105    public static JetExpression getLoopBody(@NotNull JetLoopExpression expression) {
106        JetExpression body = expression.getBody();
107        assert body != null : "Loops cannot have null bodies.";
108        return body;
109    }
110
111    @NotNull
112    public static JetParameter getLoopParameter(@NotNull JetForExpression expression) {
113        JetParameter loopParameter = expression.getLoopParameter();
114        assert loopParameter != null;
115        return loopParameter;
116    }
117
118    @NotNull
119    public static List<JetParameter> getPrimaryConstructorParameters(@NotNull JetClassOrObject classDeclaration) {
120        if (classDeclaration instanceof JetClass) {
121            return ((JetClass) classDeclaration).getPrimaryConstructorParameters();
122        }
123        return Collections.emptyList();
124    }
125
126    @NotNull
127    public static JetObjectDeclaration getObjectDeclarationForName(@NotNull JetObjectDeclarationName name) {
128        PsiElement parent = name.getParent();
129        assert parent instanceof JetObjectDeclaration :
130                "ObjectDeclarationName should have a parent of type ObjectDeclaration.";
131        return (JetObjectDeclaration) parent;
132    }
133
134    @NotNull
135    public static JetObjectDeclarationName getObjectDeclarationName(@NotNull JetObjectDeclaration objectDeclaration) {
136        //TODO: util
137        JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
138        assert nameAsDeclaration != null;
139        return nameAsDeclaration;
140    }
141
142    @NotNull
143    public static JetExpression getLoopRange(@NotNull JetForExpression expression) {
144        JetExpression rangeExpression = expression.getLoopRange();
145        assert rangeExpression != null;
146        return rangeExpression;
147    }
148
149}