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.jet.lang.psi.stubs.impl;
018    
019    import com.intellij.psi.stubs.IStubElementType;
020    import com.intellij.psi.stubs.StubBase;
021    import com.intellij.psi.stubs.StubElement;
022    import com.intellij.util.io.StringRef;
023    import org.jetbrains.annotations.Nullable;
024    import org.jetbrains.jet.lang.psi.JetProperty;
025    import org.jetbrains.jet.lang.psi.stubs.PsiJetPropertyStub;
026    import org.jetbrains.jet.lang.resolve.name.FqName;
027    
028    public class PsiJetPropertyStubImpl extends StubBase<JetProperty> implements PsiJetPropertyStub {
029        private final StringRef name;
030        private final boolean isVar;
031        private final boolean isTopLevel;
032        private final FqName topFQName;
033        private final StringRef typeText;
034        private final StringRef inferenceBodyText;
035    
036        public PsiJetPropertyStubImpl(IStubElementType elementType, StubElement parent, StringRef name,
037                boolean isVar, boolean isTopLevel, @Nullable FqName topFQName, StringRef typeText, StringRef inferenceBodyText) {
038            super(parent, elementType);
039    
040            if (isTopLevel && topFQName == null) {
041                throw new IllegalArgumentException("topFQName shouldn't be null for top level properties");
042            }
043    
044            this.name = name;
045            this.isVar = isVar;
046            this.isTopLevel = isTopLevel;
047            this.topFQName = topFQName;
048            this.typeText = typeText;
049            this.inferenceBodyText = inferenceBodyText;
050        }
051    
052        public PsiJetPropertyStubImpl(IStubElementType elementType, StubElement parent, String name,
053                boolean isVal, boolean isTopLevel, @Nullable FqName topFQName,
054                String typeText, String inferenceBodyText
055        ) {
056            this(elementType, parent, StringRef.fromString(name),
057                 isVal, isTopLevel, topFQName, StringRef.fromString(typeText), StringRef.fromString(inferenceBodyText));
058        }
059    
060        @Override
061        public boolean isVar() {
062            return isVar;
063        }
064    
065        @Override
066        public boolean isTopLevel() {
067            return isTopLevel;
068        }
069    
070        @Nullable
071        @Override
072        public FqName getTopFQName() {
073            return topFQName;
074        }
075    
076        @Override
077        public String getTypeText() {
078            return StringRef.toString(typeText);
079        }
080    
081        @Override
082        public String getInferenceBodyText() {
083            return StringRef.toString(inferenceBodyText);
084        }
085    
086        @Override
087        public String getName() {
088            return StringRef.toString(name);
089        }
090    
091        @Override
092        public String toString() {
093            StringBuilder builder = new StringBuilder();
094    
095            builder.append("PsiJetPropertyStubImpl[");
096    
097            builder.append(isVar() ? "var " : "val ");
098    
099            if (isTopLevel()) {
100                assert topFQName != null;
101                builder.append("top ").append("topFQName=").append(topFQName.toString()).append(" ");
102            }
103    
104            builder.append("name=").append(getName());
105            builder.append(" typeText=").append(getTypeText());
106            builder.append(" bodyText=").append(getInferenceBodyText());
107    
108            builder.append("]");
109    
110            return builder.toString();
111        }
112    }