001 /*
002 * Copyright 2010-2015 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.kotlin.psi;
018
019 import com.intellij.extapi.psi.StubBasedPsiElementBase;
020 import com.intellij.lang.ASTNode;
021 import com.intellij.lang.Language;
022 import com.intellij.psi.*;
023 import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
024 import com.intellij.psi.stubs.IStubElementType;
025 import com.intellij.psi.stubs.StubElement;
026 import org.jetbrains.annotations.NotNull;
027 import org.jetbrains.kotlin.idea.JetLanguage;
028 import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementType;
029
030 import java.util.Arrays;
031 import java.util.List;
032
033 public class JetElementImplStub<T extends StubElement<?>> extends StubBasedPsiElementBase<T>
034 implements JetElement, StubBasedPsiElement<T> {
035 public JetElementImplStub(@NotNull T stub, @NotNull IStubElementType nodeType) {
036 super(stub, nodeType);
037 }
038
039 public JetElementImplStub(@NotNull ASTNode node) {
040 super(node);
041 }
042
043 @NotNull
044 @Override
045 public Language getLanguage() {
046 return JetLanguage.INSTANCE;
047 }
048
049 @Override
050 public String toString() {
051 return getElementType().toString();
052 }
053
054 @Override
055 public final void accept(@NotNull PsiElementVisitor visitor) {
056 if (visitor instanceof JetVisitor) {
057 accept((JetVisitor) visitor, null);
058 }
059 else {
060 visitor.visitElement(this);
061 }
062 }
063
064 @NotNull
065 @Override
066 public JetFile getContainingJetFile() {
067 PsiFile file = getContainingFile();
068 assert file instanceof JetFile : "JetElement not inside JetFile: " + file + " " + file.getText();
069 return (JetFile) file;
070 }
071
072 @Override
073 public <D> void acceptChildren(@NotNull JetVisitor<Void, D> visitor, D data) {
074 PsiElement child = getFirstChild();
075 while (child != null) {
076 if (child instanceof JetElement) {
077 ((JetElement) child).accept(visitor, data);
078 }
079 child = child.getNextSibling();
080 }
081 }
082
083 @Override
084 public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
085 return visitor.visitJetElement(this, data);
086 }
087
088 @Override
089 public PsiReference getReference() {
090 PsiReference[] references = getReferences();
091 if (references.length == 1) return references[0];
092 else return null;
093 }
094
095 @NotNull
096 @Override
097 public PsiReference[] getReferences() {
098 return ReferenceProvidersRegistry.getReferencesFromProviders(this, PsiReferenceService.Hints.NO_HINTS);
099 }
100
101 @NotNull
102 protected <PsiT extends JetElementImplStub<?>, StubT extends StubElement> List<PsiT> getStubOrPsiChildrenAsList(
103 @NotNull JetStubElementType<StubT, PsiT> elementType
104 ) {
105 return Arrays.asList(getStubOrPsiChildren(elementType, elementType.getArrayFactory()));
106 }
107 }