blob: b1e530e91b8f9f7541a6a39d41b618b8857c843f [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.extapi.psi.StubBasedPsiElementBase;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiClass;
import com.intellij.psi.impl.DebugUtil;
import com.intellij.psi.impl.java.stubs.JavaClassElementType;
import com.intellij.psi.impl.java.stubs.PsiClassStub;
import com.intellij.psi.stubs.StubBase;
import com.intellij.psi.stubs.StubElement;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.Nullable;
/**
* @author max
*/
public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements PsiClassStub<T> {
private final StringRef myQualifiedName;
private final StringRef myName;
private final StringRef myBaseRefText;
private final byte myFlags;
private static final int DEPRECATED = 0x01;
private static final int INTERFACE = 0x02;
private static final int ENUM = 0x04;
private static final int ENUM_CONSTANT_INITIALIZER = 0x08;
private static final int ANONYMOUS = 0x10;
private static final int ANON_TYPE = 0x20;
private static final int IN_QUALIFIED_NEW = 0x40;
private static final int DEPRECATED_ANNOTATION = 0x80;
private LanguageLevel myLanguageLevel = null;
private StringRef mySourceFileName = null;
public PsiClassStubImpl(final JavaClassElementType type,
final StubElement parent,
final String qualifiedName,
final String name,
@Nullable final String baseRefText,
final byte flags) {
this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), StringRef.fromString(baseRefText), flags);
}
public PsiClassStubImpl(final JavaClassElementType type,
final StubElement parent,
final StringRef qualifiedName,
final StringRef name,
final StringRef baseRefText,
final byte flags) {
super(parent, type);
myQualifiedName = qualifiedName;
myName = name;
myBaseRefText = baseRefText;
myFlags = flags;
if (StubBasedPsiElementBase.ourTraceStubAstBinding) {
String creationTrace = "Stub creation thread: " + Thread.currentThread() + "\n" + DebugUtil.currentStackTrace();
putUserData(StubBasedPsiElementBase.CREATION_TRACE, creationTrace);
}
}
@Override
public String getName() {
return StringRef.toString(myName);
}
@Override
public String getQualifiedName() {
return StringRef.toString(myQualifiedName);
}
@Override
public String getBaseClassReferenceText() {
return StringRef.toString(myBaseRefText);
}
@Override
public boolean isDeprecated() {
return (myFlags & DEPRECATED) != 0;
}
@Override
public boolean hasDeprecatedAnnotation() {
return (myFlags & DEPRECATED_ANNOTATION) != 0;
}
@Override
public boolean isInterface() {
return (myFlags & INTERFACE) != 0;
}
@Override
public boolean isEnum() {
return (myFlags & ENUM) != 0;
}
@Override
public boolean isEnumConstantInitializer() {
return isEnumConstInitializer(myFlags);
}
public static boolean isEnumConstInitializer(final byte flags) {
return (flags & ENUM_CONSTANT_INITIALIZER) != 0;
}
@Override
public boolean isAnonymous() {
return isAnonymous(myFlags);
}
public static boolean isAnonymous(final byte flags) {
return (flags & ANONYMOUS) != 0;
}
@Override
public boolean isAnnotationType() {
return (myFlags & ANON_TYPE) != 0;
}
@Override
public LanguageLevel getLanguageLevel() {
return myLanguageLevel != null ? myLanguageLevel : LanguageLevel.HIGHEST;
}
@Override
public String getSourceFileName() {
return StringRef.toString(mySourceFileName);
}
public void setLanguageLevel(final LanguageLevel languageLevel) {
myLanguageLevel = languageLevel;
}
public void setSourceFileName(final StringRef sourceFileName) {
mySourceFileName = sourceFileName;
}
public void setSourceFileName(final String sourceFileName) {
mySourceFileName = StringRef.fromString(sourceFileName);
}
@Override
public boolean isAnonymousInQualifiedNew() {
return (myFlags & IN_QUALIFIED_NEW) != 0;
}
public byte getFlags() {
return myFlags;
}
public static byte packFlags(boolean isDeprecated,
boolean isInterface,
boolean isEnum,
boolean isEnumConstantInitializer,
boolean isAnonymous,
boolean isAnnotationType,
boolean isInQualifiedNew,
boolean hasDeprecatedAnnotation) {
byte flags = 0;
if (isDeprecated) flags |= DEPRECATED;
if (isInterface) flags |= INTERFACE;
if (isEnum) flags |= ENUM;
if (isEnumConstantInitializer) flags |= ENUM_CONSTANT_INITIALIZER;
if (isAnonymous) flags |= ANONYMOUS;
if (isAnnotationType) flags |= ANON_TYPE;
if (isInQualifiedNew) flags |= IN_QUALIFIED_NEW;
if (hasDeprecatedAnnotation) flags |= DEPRECATED_ANNOTATION;
return flags;
}
@SuppressWarnings({"HardCodedStringLiteral"})
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("PsiClassStub[");
if (isInterface()) {
builder.append("interface ");
}
if (isAnonymous()) {
builder.append("anonymous ");
}
if (isEnum()) {
builder.append("enum ");
}
if (isAnnotationType()) {
builder.append("annotation ");
}
if (isEnumConstantInitializer()) {
builder.append("enumInit ");
}
if (isDeprecated()) {
builder.append("deprecated ");
}
if (hasDeprecatedAnnotation()) {
builder.append("deprecatedA ");
}
builder.append("name=").append(getName()).append(" fqn=").append(getQualifiedName());
if (getBaseClassReferenceText() != null) {
builder.append(" baseref=").append(getBaseClassReferenceText());
}
if (isAnonymousInQualifiedNew()) {
builder.append(" inqualifnew");
}
builder.append("]");
return builder.toString();
}
}