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.PsiElement;
020 import com.intellij.psi.tree.IElementType;
021 import org.jetbrains.annotations.NotNull;
022 import org.jetbrains.annotations.Nullable;
023 import org.jetbrains.jet.lang.psi.*;
024 import org.jetbrains.jet.lexer.JetToken;
025 import org.jetbrains.jet.lexer.JetTokens;
026
027 import java.util.Collections;
028 import java.util.List;
029
030 public 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 }