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.ASTWrapperPsiElement;
020    import com.intellij.lang.ASTNode;
021    import com.intellij.lang.Language;
022    import com.intellij.psi.PsiElementVisitor;
023    import com.intellij.psi.PsiFile;
024    import com.intellij.psi.PsiReference;
025    import com.intellij.psi.PsiReferenceService;
026    import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
027    import org.jetbrains.annotations.NotNull;
028    import org.jetbrains.kotlin.idea.JetLanguage;
029    
030    public class JetElementImpl extends ASTWrapperPsiElement implements JetElement {
031        public JetElementImpl(@NotNull ASTNode node) {
032            super(node);
033        }
034    
035        @NotNull
036        @Override
037        public Language getLanguage() {
038            return JetLanguage.INSTANCE;
039        }
040    
041        @Override
042        public String toString() {
043            return getNode().getElementType().toString();
044        }
045    
046        @Override
047        public final void accept(@NotNull PsiElementVisitor visitor) {
048            if (visitor instanceof JetVisitor) {
049                accept((JetVisitor) visitor, null);
050            }
051            else {
052                visitor.visitElement(this);
053            }
054        }
055    
056        @NotNull
057        @Override
058        public JetFile getContainingJetFile() {
059            PsiFile file = getContainingFile();
060            assert file instanceof JetFile : "JetElement not inside JetFile: " + file + " " + file.getText();
061            return (JetFile) file;
062        }
063    
064        @Override
065        public <D> void acceptChildren(@NotNull JetVisitor<Void, D> visitor, D data) {
066            JetPsiUtil.visitChildren(this, visitor, data);
067        }
068    
069        @Override
070        public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
071            return visitor.visitJetElement(this, data);
072        }
073    
074        @Override
075        public PsiReference getReference() {
076            PsiReference[] references = getReferences();
077            if (references.length == 1) return references[0];
078            else return null;
079        }
080    
081        @NotNull
082        @Override
083        public PsiReference[] getReferences() {
084            return ReferenceProvidersRegistry.getReferencesFromProviders(this, PsiReferenceService.Hints.NO_HINTS);
085        }
086    }