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