blob: aa2fae39657de5386bbb5173d08f3d9dee80b8db [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.compiled;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.TreeElement;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
public class ClsReferenceParameterListImpl extends ClsElementImpl implements PsiReferenceParameterList {
@NonNls private static final String EXTENDS_PREFIX = "?extends";
@NonNls private static final String SUPER_PREFIX = "?super";
private final PsiElement myParent;
private final ClsTypeElementImpl[] myTypeParameters;
private volatile PsiType[] myTypeParametersCachedTypes = null;
public ClsReferenceParameterListImpl(PsiElement parent, String[] classParameters) {
myParent = parent;
int length = classParameters.length;
myTypeParameters = new ClsTypeElementImpl[length];
for (int i = 0; i < length; i++) {
String s = classParameters[length - i - 1];
char variance = ClsTypeElementImpl.VARIANCE_NONE;
if (s.startsWith(EXTENDS_PREFIX)) {
variance = ClsTypeElementImpl.VARIANCE_EXTENDS;
s = s.substring(EXTENDS_PREFIX.length());
}
else if (s.startsWith(SUPER_PREFIX)) {
variance = ClsTypeElementImpl.VARIANCE_SUPER;
s = s.substring(SUPER_PREFIX.length());
}
else if (StringUtil.startsWithChar(s, '?')) {
variance = ClsTypeElementImpl.VARIANCE_INVARIANT;
s = s.substring(1);
}
myTypeParameters[i] = new ClsTypeElementImpl(this, s, variance);
}
}
@Override
public void appendMirrorText(int indentLevel, @NotNull StringBuilder buffer) { }
@Override
public void setMirror(@NotNull TreeElement element) throws InvalidMirrorException { }
@NotNull
@Override
public PsiTypeElement[] getTypeParameterElements() {
return myTypeParameters;
}
@NotNull
@Override
public PsiType[] getTypeArguments() {
PsiType[] cachedTypes = myTypeParametersCachedTypes;
if (cachedTypes == null) {
cachedTypes = PsiType.createArray(myTypeParameters.length);
for (int i = 0; i < cachedTypes.length; i++) {
cachedTypes[cachedTypes.length - i - 1] = myTypeParameters[i].getType();
}
myTypeParametersCachedTypes = cachedTypes;
}
return cachedTypes;
}
@NotNull
@Override
public PsiElement[] getChildren() {
return myTypeParameters;
}
@Override
public PsiElement getParent() {
return myParent;
}
}