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}