blob: d4ef43b966324af204ae984cbda1e3a523574c4c [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.impl.java.stubs.impl;
import com.intellij.psi.PsiField;
import com.intellij.psi.impl.cache.TypeInfo;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiFieldStub;
import com.intellij.psi.stubs.StubBase;
import com.intellij.psi.stubs.StubElement;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author max
*/
public class PsiFieldStubImpl extends StubBase<PsiField> implements PsiFieldStub {
private final StringRef myName;
private final TypeInfo myType;
private final StringRef myInitializer;
private final byte myFlags;
private static final int ENUM_CONST = 0x01;
private static final int DEPRECATED = 0x02;
private static final int DEPRECATED_ANNOTATION = 0x04;
public PsiFieldStubImpl(StubElement parent, String name, @NotNull TypeInfo type, @Nullable String initializer, byte flags) {
this(parent, StringRef.fromString(name), type, StringRef.fromString(initializer), flags);
}
public PsiFieldStubImpl(StubElement parent, StringRef name, @NotNull TypeInfo type, @Nullable StringRef initializer, byte flags) {
super(parent, isEnumConst(flags) ? JavaStubElementTypes.ENUM_CONSTANT : JavaStubElementTypes.FIELD);
myName = name;
myType = type;
myInitializer = initializer;
myFlags = flags;
}
@Override
@NotNull
public TypeInfo getType(boolean doResolve) {
return doResolve ? myType.applyAnnotations(this) : myType;
}
@Override
public String getInitializerText() {
return StringRef.toString(myInitializer);
}
public byte getFlags() {
return myFlags;
}
@Override
public boolean isEnumConstant() {
return isEnumConst(myFlags);
}
private static boolean isEnumConst(final byte flags) {
return (flags & ENUM_CONST) != 0;
}
@Override
public boolean isDeprecated() {
return (myFlags & DEPRECATED) != 0;
}
@Override
public boolean hasDeprecatedAnnotation() {
return (myFlags & DEPRECATED_ANNOTATION) != 0;
}
@Override
public String getName() {
return StringRef.toString(myName);
}
public static byte packFlags(boolean isEnumConst, boolean isDeprecated, boolean hasDeprecatedAnnotation) {
byte flags = 0;
if (isEnumConst) flags |= ENUM_CONST;
if (isDeprecated) flags |= DEPRECATED;
if (hasDeprecatedAnnotation) flags |= DEPRECATED_ANNOTATION;
return flags;
}
@SuppressWarnings({"HardCodedStringLiteral"})
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("PsiFieldStub[");
if (isDeprecated() || hasDeprecatedAnnotation()) {
builder.append("deprecated ");
}
if (isEnumConstant()) {
builder.append("enumconst ");
}
builder.append(myName).append(':').append(myType);
if (myInitializer != null) {
builder.append('=').append(myInitializer);
}
builder.append("]");
return builder.toString();
}
}