001    /*
002     * Copyright 2010-2014 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.jet.lang.psi;
018    
019    import com.intellij.lang.ASTNode;
020    import com.intellij.psi.PsiElement;
021    import org.jetbrains.annotations.NotNull;
022    import org.jetbrains.annotations.Nullable;
023    import org.jetbrains.jet.JetNodeTypes;
024    import org.jetbrains.jet.lang.resolve.name.FqName;
025    import org.jetbrains.jet.lang.resolve.name.Name;
026    import org.jetbrains.jet.lang.resolve.name.SpecialNames;
027    
028    import java.util.List;
029    
030    public class JetPackageDirective extends JetReferenceExpression {
031        private String qualifiedNameCache = null;
032    
033        public JetPackageDirective(@NotNull ASTNode node) {
034            super(node);
035        }
036    
037        @NotNull
038        public List<JetSimpleNameExpression> getPackageNames() {
039            return findChildrenByType(JetNodeTypes.REFERENCE_EXPRESSION);
040        }
041    
042        @Nullable
043        public PsiElement getNameIdentifier() {
044            JetSimpleNameExpression lastPart = (JetSimpleNameExpression)findLastChildByType(JetNodeTypes.REFERENCE_EXPRESSION);
045            if (lastPart == null) {
046                return null;
047            }
048    
049            return lastPart.getIdentifier();
050        }
051    
052        @Override
053        @NotNull
054        public String getName() {
055            PsiElement nameIdentifier = getNameIdentifier();
056            return nameIdentifier == null ? "" : nameIdentifier.getText();
057        }
058    
059        @NotNull
060        public Name getNameAsName() {
061            PsiElement nameIdentifier = getNameIdentifier();
062            return nameIdentifier == null ? SpecialNames.ROOT_PACKAGE : Name.identifier(nameIdentifier.getText());
063        }
064    
065        public boolean isRoot() {
066            return getName().length() == 0;
067        }
068    
069        @NotNull
070        public FqName getFqName() {
071            String qualifiedName = getQualifiedName();
072            return qualifiedName.isEmpty() ? FqName.ROOT : new FqName(qualifiedName);
073        }
074    
075        @NotNull
076        public FqName getFqName(JetSimpleNameExpression nameExpression) {
077            return new FqName(getQualifiedNameOf(nameExpression));
078        }
079    
080        @NotNull
081        public String getQualifiedName() {
082            if (qualifiedNameCache == null) {
083                qualifiedNameCache = getQualifiedNameOf(null);
084            }
085    
086            return qualifiedNameCache;
087        }
088    
089        @NotNull
090        private String getQualifiedNameOf(@Nullable JetSimpleNameExpression nameExpression) {
091            StringBuilder builder = new StringBuilder();
092            for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) {
093                if (builder.length() > 0) {
094                    builder.append(".");
095                }
096                builder.append(e.getReferencedName());
097    
098                if (e == nameExpression) {
099                    break;
100                }
101            }
102            return builder.toString();
103        }
104    
105        @Override
106        public void subtreeChanged() {
107            qualifiedNameCache = null;
108        }
109    }
110